Implementar resiliência do aplicativo
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:
- Adicione o pacote
Microsoft.Extensions.Http.Resilience
ao seu projeto. - Adicione um manipulador de resiliência às chamadas de serviço HttpClient.
- 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.
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. |
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.