Implementar resiliência do aplicativo
Os recursos de resiliência do .NET são criados com base no projeto Polly e disponibilizados por meio de Microsoft.Extensions. Você pode adicionar uma estratégia de resiliência padrão que usa 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
Microsoft.Extensions.Http.Resiliencepacote ao seu projeto. - Adicione um handler de resiliência nas chamadas de serviço do 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 esse comando do terminal na pasta de projeto de aplicativos adicionará a referência de pacote ao arquivo de projeto.
Em seguida, adicione a seguinte instrução using à classe de inicialização do aplicativo:
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 serviço HttpClient. O .NET fornece essa configuração pronta para uso combinando várias estratégias.
Um diagrama mostrando as estratégias incluídas no Manipulador de Resiliência Padrão. Tempo limite geral, repetição, compartimentação, disjuntor e tempo limite de tentativa.
O manipulador de solicitações passa por cada uma dessas estratégias na ordem da esquerda para a direita:
- Estratégia de tempo limite total da solicitação: isso define um período 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 WebApplicatione 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 anterior 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 o padrão de 30 segundos, as opções de repetição causarão uma exceção. Esse é um erro, porque a configuração de retirada exponencial faria com que o tempo total para concluir as 10 tentativas fosse de 2.046 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. A predefinição é 30 segundos. |
| OnTimeout | Uma função de retorno de chamada que é invocada quando a solicitação atinge o tempo limite. O padrão é null. |
| 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. Jitter adiciona aleatoriedade ao atraso para ajudar a reduzir os picos de carga. O padrão é true. |
| BaseDelay | O Intervalo entre tentativas. O padrão é 2 segundos. |
| Opções do disjuntor | Descrição |
|---|---|
| DuraçãoDaPausa | A duração da quebra do circuito. O padrão é 5 segundos. |
| Taxa de Falhas | A taxa de solicitações com falha para solicitações bem-sucedidas que abrirão o circuito. O padrão é 0.1. |
| Duração da Amostragem | A duração do tempo em que a taxa de falha é calculada. A predefinição é 30 segundos. |
| OnClosed | 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 | Descrição |
|---|---|
| Intervalo | 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 é null. |
O diagrama de sequência mostra como cada uma das estratégias funcionam em conjunto em uma estratégia de resiliência padrão. Para começar, a estratégia de tempo limite total controla o fator limitante de quanto tempo uma solicitação pode levar. 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.