Implementar resiliência de aplicativos
Os recursos de resiliência do .NET são criados com base no projeto Polly e disponibilizados através Microsoft.Extensions
do . 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:
- Adicione o
Microsoft.Extensions.Http.Resilience
pacote ao seu projeto. - Adicione um manipulador de resiliência às suas 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 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.
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. |
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.