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 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:

  1. Agregue el paquete Microsoft.Extensions.Http.Resilience al proyecto.
  2. Agregue un controlador de resistencia a las llamadas de servicio HttpClient.
  3. 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.

A diagram showing the strategies included in the Standard Resilience Handler. From overall timeout, retry, bulkhead, circuit breaker, and attempt timeout.

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.

A sequence diagram showing the flow of events in an application using a resiliency strategy.

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.