Implementar resiliência do aplicativo

Concluído

Os recursos de resiliência do .NET são criados com base no projeto Polly e disponibilizados por meio do Microsoft.Extensions. Você pode adicionar uma estratégia de resiliência padrão que use padrões sensatos adicionando uma única linha de código ao seu aplicativo.

Adicionar resiliência ao seu aplicativo

Para adicionar resiliência a um aplicativo criado usando uma arquitetura de microsserviços, usando solicitações HTTP entre serviços individuais, execute estas etapas:

  1. Adicione o pacote Microsoft.Extensions.Http.Resilience ao seu projeto.
  2. Adicione um manipulador de resiliência às chamadas de serviço HttpClient.
  3. Configure a estratégia de resiliência.

Adicionar o pacote NuGet ao seu projeto

Execute o seguinte comando para adicionar o pacote NuGet de resiliência:

dotnet add package Microsoft.Extensions.Http.Resilience

Executar este comando a partir do terminal na pasta do projeto de aplicativos adicionará a referência do pacote ao arquivo de projeto.

Na classe de inicialização do aplicativo, adicione a seguinte instrução usando:

using Microsoft.Extensions.Http.Resilience;

Adicionar uma estratégia de resiliência

Agora você pode adicionar uma estratégia de resiliência padrão ao seu serviço HttpClient. O .NET fornece essa configuração pronta para uso combinando várias estratégias.

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

O manipulador de solicitação passa por cada uma das estratégias acima na ordem da esquerda para a direita:

  • Estratégia total de tempo limite da solicitação: Isso define uma quantidade total de tempo que a solicitação pode levar. Você pode considerar isso como a definição do limite de tempo superior para todas as outras estratégias.
  • Estratégia de repetição: Essa estratégia controla as opções em número de repetições, retirada e oscilações. Essas opções não podem exceder o tempo limite total definido na estratégia anterior.
  • Estratégia do disjuntor: Essa estratégia abrirá o circuito se a taxa de falha exceder o limite.
  • Estratégia de tempo limite de tentativa: Essa estratégia define um tempo limite para cada solicitação individual. Se a solicitação demorar mais do que esse tempo, uma exceção será gerada.

Você pode adicionar essa estratégia padrão, com todos os valores padrão adicionando este método de extensão:

.AddStandardResilienceHandler();

Por exemplo, se você declarou um WebApplication e deseja adicionar uma estratégia de resiliência ao serviço HttpClient, use este código:

builder.Services.AddHttpClient<ServiceBeingCalled>(httpClient =>
{
    httpClient.BaseAddress = new Uri("https://service.endpoint/");
}).AddStandardResilienceHandler();

A primeira linha do código acima adiciona um manipulador de resiliência padrão ao HTTPClient. Isso usará todas as configurações padrão para as estratégias de repetição e disjuntor.

Configurar a estratégia de resiliência

Você pode alterar os valores padrão de qualquer uma das estratégias especificando novas opções, por exemplo:

.AddStandardResilienceHandler( options => 
{  
    options.RetryOptions.RetryCount = 10;
    options.RetryOptions.BaseDelay = TimeSpan.FromSeconds(1);
});

Esse código altera o padrão da estratégia de repetição para ter um número máximo de 10 tentativas, para usar uma retirada linear com um atraso base de 1 segundo.

As opções escolhidas devem ser compatíveis entre si. Por exemplo, se o tempo total permanecer como padrão de 30 segundos, as opções de repetição acima causarão uma exceção. Isso é um erro porque a configuração de retirada exponencial faria com que o tempo total para concluir as 10 tentativas fosse de 2046 segundos. Essa é uma exceção de runtime, não um erro de tempo de compilação.

A tabela a seguir lista as opções disponíveis para cada uma das estratégias.

Total de opções de tempo limite de solicitação Descrição
TotalTimeout O tempo total que a solicitação pode levar. O padrão é 30 segundos.
OnTimeout Uma função de retorno de chamada que é invocada quando a solicitação atinge o tempo limite. O padrão é nulo.

Opções de nova tentativa Descrição
RetryCount O número máximo de repetições. O padrão é 3.
BackoffType O tipo de retirada a ser usado. Você pode escolher entre linear e exponencial. O padrão é exponencial.
UseJitter Se deve adicionar oscilação à retirada. A oscilação adiciona aleatoriedade ao atraso para ajudar a reduzir picos de carga. O padrão é true.
BaseDelay O intervalo entre repetições. O padrão é 2 segundos.

Opções do disjuntor Descrição
BreakDuration A duração da quebra do circuito. O padrão é 5 segundos.
FailureRatio A taxa de solicitações com falha para solicitações bem-sucedidas que abrirão o circuito. O padrão é 0.1.
SamplingDuration A duração do tempo em que a taxa de falha é calculada. O padrão é 30 segundos.
Onclosed Uma função de retorno de chamada que é invocada quando o circuito é fechado. O padrão é nulo.
OnHalfOpened Uma função de retorno de chamada que é invocada quando o circuito está semiaberto. O padrão é nulo.
OnOpened Uma função de retorno de chamada que é invocada quando o circuito é aberto. O padrão é nulo.

Opções de tempo limite de tentativa Descrição
Tempo limite O tempo que a solicitação pode levar. O padrão é 2 segundos.
OnTimeout Uma função de retorno de chamada que é invocada quando a solicitação atinge o tempo limite. O padrão é nulo.

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

O diagrama de sequência acima mostra como cada uma das estratégias funciona em conjunto numa estratégia de resiliência padrão. Para começar, o fator limitante de quanto tempo uma solicitação pode levar é controlado pela estratégia de tempo limite total. Em seguida, a estratégia de repetição deve ser definida para ter um número máximo de tentativas que serão concluídas dentro do tempo limite total. A estratégia do disjuntor abrirá o circuito se a taxa de falha exceder o limite definido para ele. A estratégia de tempo limite de tentativa define um tempo limite para cada solicitação individual. Se a solicitação demorar mais do que esse tempo, uma exceção será gerada.