Implementación de la resistencia de la aplicación

Completado

Las características de resistencia de .NET se basan en el proyecto Polly y están disponibles a través de Microsoft.Extensions. Puede agregar una estrategia de resistencia estándar que use valores predeterminados razonables agregando 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 creada mediante una arquitectura de microservicios, use solicitudes HTTP entre servicios individuales, siga estos pasos:

  1. Agregue el Microsoft.Extensions.Http.Resilience paquete al proyecto.
  2. Agregue un manejador de resiliencia a las llamadas de servicio HttpClient.
  3. Configure la estrategia de resistencia.

Adición del paquete NuGet al proyecto

Ejecute el siguiente comando 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.

A continuación, agregue la siguiente instrucción using en la clase de inicio de la aplicación:

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 que combina varias estrategias.

Un diagrama que muestra las estrategias incluidas en el controlador de resiliencia estándar: desde el tiempo de espera general, reintento, bulkhead, disyuntor y tiempo de espera de intentos.

El controlador de solicitudes pasa por cada una de estas estrategias en orden de izquierda a derecha:

  • Estrategia total de tiempo de espera de solicitud: establece una 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 en el número de reintentos, retrocesos y vibración. 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 agregando este método de extensión:

.AddStandardResilienceHandler();

Por ejemplo, si ha declarado un WebApplicationy desea 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 especificando 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 retiradas 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 como valor predeterminado de 30 segundos, las opciones de reintento provocarán una excepción. Se trata de un error porque la configuración de retroceso exponencial haría que el tiempo total completara los 10 reintentos para ser de 2046 segundos. Se trata de una excepción en tiempo de ejecución, 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 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
Número de intentos 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. Jitter 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
DuraciónDelDescanso Duración de la interrupción del circuito. El valor predeterminado es 5 segundos.
Ratio de Fallos Proporción entre solicitudes con error y solicitudes correctas que abrirán el circuito. El valor predeterminado es 0.1.
Duración de muestreo Duración del tiempo en el que se calcula 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
Timeout 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.

Diagrama de secuencia que muestra el flujo de eventos en una aplicación mediante una estrategia de resistencia.

El diagrama de secuencia muestra cómo cada una de las estrategias funciona juntas en una estrategia de resistencia estándar. Para empezar, la estrategia de tiempo de espera total controla el factor de limitación de cuánto tiempo puede tardar una solicitud. A continuación, la estrategia de reintento debe establecerse 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.