Implementación de la resistencia de la aplicación
Las características de resistencia de .NET se basan en el proyecto Polly y están disponibles mediante Microsoft.Extensions
. Puede agregar una estrategia de resistencia estándar en la que se usen valores predeterminados razonables si agrega una sola línea de código a la aplicación.
Adición de resistencia a la aplicación
Para agregar resistencia a una aplicación compilada mediante una arquitectura de microservicios y usar solicitudes HTTP entre servicios individuales, siga estos pasos:
- Agregue el paquete
Microsoft.Extensions.Http.Resilience
al proyecto. - Agregue un controlador de resistencia a las llamadas de servicio HttpClient.
- Configure la estrategia de resistencia.
Adición del paquete NuGet al proyecto
Ejecute el comando siguiente para agregar el paquete NuGet de resistencia:
dotnet add package Microsoft.Extensions.Http.Resilience
Al ejecutar este comando desde el terminal de la carpeta del proyecto de aplicaciones, se agregará la referencia de paquete al archivo del proyecto.
En la clase de inicio de la aplicación, agregue la siguiente instrucción using:
using Microsoft.Extensions.Http.Resilience;
Adición de una estrategia de resistencia
Ahora puede agregar una estrategia de resistencia estándar al servicio HttpClient. .NET proporciona esta configuración integrada mediante la combinación de varias estrategias.
El controlador de solicitudes pasa por cada una de las estrategias anteriores en orden de izquierda a derecha:
- Estrategia de tiempo de espera total de solicitudes: Esto establece la cantidad total de tiempo que puede tardar la solicitud. Puede considerar esto como establecer el límite de tiempo superior para todas las demás estrategias.
- Estrategia de reintento: Esta estrategia controla las opciones del número de reintentos, retrocesos e inestabilidad. Estas opciones no pueden superar el tiempo de espera total establecido en la estrategia anterior.
- Estrategia de disyuntor: Esta estrategia abre el circuito si la proporción de errores supera el umbral.
- Estrategia de tiempo de espera de intento: Esta estrategia establece un tiempo de espera para cada solicitud individual. Si la solicitud tarda más de este tiempo, se produce una excepción.
Puede agregar esta estrategia estándar, con todos los valores predeterminados, si agrega este método de extensión:
.AddStandardResilienceHandler();
Por ejemplo, si ha declarado una instancia de WebApplication
y quiere agregar una estrategia de resistencia al servicio HttpClient, use este código:
builder.Services.AddHttpClient<ServiceBeingCalled>(httpClient =>
{
httpClient.BaseAddress = new Uri("https://service.endpoint/");
}).AddStandardResilienceHandler();
La primera línea del código anterior agrega un controlador de resistencia estándar a HTTPClient. Esto usará toda la configuración predeterminada para las estrategias de reintentos y disyuntores.
Configuración de la estrategia de resistencia
Puede cambiar los valores predeterminados de cualquiera de las estrategias si especifica nuevas opciones, por ejemplo:
.AddStandardResilienceHandler( options =>
{
options.RetryOptions.RetryCount = 10;
options.RetryOptions.BaseDelay = TimeSpan.FromSeconds(1);
});
Este código cambia los valores predeterminados de la estrategia de reintento para tener un número máximo de 10, para usar un retroceso lineal y usar un retraso base de 1 segundo.
Las opciones que elija deben ser compatibles entre sí. Por ejemplo, si el tiempo total permanece en el valor predeterminado de 30 segundos, las opciones de reintento anteriores provocarán una excepción. Se trata de un error porque la configuración de retroceso exponencial provocaría que el tiempo total completara los 10 reintentos en 2046 segundos. Se trata de una excepción en tiempo de ejecución, de no un error en tiempo de compilación.
En la tabla siguiente se enumeran las opciones disponibles para cada una de las estrategias.
Opciones de tiempo de espera total de solicitudes | Descripción |
---|---|
TotalTimeout | La cantidad total de tiempo que puede tardar la solicitud. El valor predeterminado es 30 segundos. |
OnTimeout | Función de devolución de llamada que se invoca cuando se agota el tiempo de espera de la solicitud. El valor predeterminado es null. |
Opciones de reintento | Descripción |
---|---|
RetryCount | El número máximo de reintentos. El valor predeterminado es 3. |
BackoffType | Tipo de retroceso que se va a usar. Puede elegir entre lineal y exponencial. El valor predeterminado es exponencial. |
UseJitter | Si se va a agregar vibración al retroceso. La vibración agrega aleatoriedad al retraso para ayudar a reducir los picos de carga. El valor predeterminado es true. |
BaseDelay | El retraso entre los reintentos. El valor predeterminado es de 2 segundos. |
Opciones del disyuntor | Descripción |
---|---|
BreakDuration | Duración de la interrupción del circuito. El valor predeterminado es 5 segundos. |
FailureRatio | Proporción entre solicitudes con error y solicitudes correctas que abrirán el circuito. El valor predeterminado es 0,1. |
SamplingDuration | Duración del tiempo de cálculo de la proporción de errores. El valor predeterminado es 30 segundos. |
OnClosed | Función de devolución de llamada que se invoca cuando se cierra el circuito. El valor predeterminado es null. |
OnHalfOpened | Función de devolución de llamada que se invoca cuando se el circuito está a medio abrir. El valor predeterminado es null. |
OnOpened | Función de devolución de llamada que se invoca cuando el circuito está abierto. El valor predeterminado es null. |
Opciones de tiempo de espera de intento | Descripción |
---|---|
Tiempo de espera | La cantidad de tiempo que puede tardar la solicitud. El valor predeterminado es de 2 segundos. |
OnTimeout | Función de devolución de llamada que se invoca cuando se agota el tiempo de espera de la solicitud. El valor predeterminado es null. |
En el diagrama de secuencia anterior se muestra el funcionamiento conjunto de cada una de las estrategias en una estrategia de resistencia estándar. Para comenzar, el factor de limitación de cuánto tiempo puede tardar una solicitud se controla mediante la estrategia de tiempo de espera total. Después, se debe establecer la estrategia de reintento para tener un número máximo de reintentos que se completarán dentro del tiempo de espera total. La estrategia del disyuntor abrirá el circuito si la proporción de errores supera el umbral establecido. La estrategia de tiempo de espera de intento establece un tiempo de espera para cada solicitud individual. Si la solicitud tarda más de este tiempo, se produce una excepción.