Implementar resiliência de aplicativos

Concluído

Os recursos de resiliência do .NET são criados com base no projeto Polly e disponibilizados através Microsoft.Extensionsdo . Você pode adicionar uma estratégia de resiliência padrão que usa padrões sensíveis adicionando uma única linha de código ao seu aplicativo.

Adicione 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, siga estas etapas:

  1. Adicione o Microsoft.Extensions.Http.Resilience pacote ao seu projeto.
  2. Adicione um manipulador de resiliência às suas 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 seu aplicativo, adicione a seguinte instrução using:

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 em ordem da esquerda para a direita:

  • Estratégia de tempo limite total da solicitação: define uma quantidade total de tempo que a solicitação pode levar. Você pode pensar nisso como definir o limite máximo de tempo para todas as outras estratégias.
  • Estratégia de repetição: esta estratégia controla as opções em número de tentativas, backoff e instabilidade. Essas opções não podem exceder o tempo limite total definido na estratégia anterior.
  • Estratégia do disjuntor: Esta estratégia abre o circuito se a taxa de falha exceder o limite.
  • Estratégia de tempo limite de tentativa: esta 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á lançada.

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 os padrões da estratégia de repetição para ter um número máximo de desativações de 10, para usar um recuo linear e usar um atraso de base de 1 segundo.

As opções escolhidas têm de 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 backoff exponencial faria com que o tempo total para concluir as 10 tentativas fosse de 2046 segundos. Esta é uma exceção de tempo de execução, 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.

Opções de tempo limite total de solicitação Description
TotalTimeout A quantidade total de tempo que a solicitação pode levar. A predefinição é 30 segundos.
OnTimeout Uma função de retorno de chamada que é invocada quando a solicitação expira. O padrão é null.

Opções de repetição Description
RetryCount O número máximo de repetições. O padrão é 3.
BackoffType O tipo de recuo a ser usado. Você pode escolher entre linear e exponencial. O padrão é exponencial.
UseJitter Se deve adicionar jitter ao backoff. O desvio adiciona aleatoriedade ao atraso para ajudar a reduzir picos de carga. O padrão é true.
BaseDelay O atraso entre as tentativas. O padrão é 2 segundos.

Opções de disjuntor Description
DuraçãoPausa A duração da interrupção do circuito. O padrão é 5 segundos.
Índice de Falhas A proporção de solicitações com falha para solicitações bem-sucedidas que abrirão o circuito. O padrão é 0.1.
AmostragemDuração A duração do tempo durante o qual a taxa de falha é calculada. A predefinição é 30 segundos.
Fechado Uma função de retorno de chamada que é invocada quando o circuito é fechado. O padrão é null.
OnHalfOpened Uma função de retorno de chamada que é invocada quando o circuito está semiaberto. O padrão é null.
OnOpened Uma função de retorno de chamada que é invocada quando o circuito é aberto. O padrão é null.

Opções de tempo limite de tentativa Description
Limite de tempo excedido A quantidade de tempo que o pedido pode demorar. O padrão é 2 segundos.
OnTimeout Uma função de retorno de chamada que é invocada quando a solicitação expira. O padrão é null.

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 em uma 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. 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á lançada.