Implementar resiliência de aplicativos
Os recursos de resiliência do .NET são criados com base no projeto Polly e disponibilizados através do Microsoft.Extensions. 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 pacote
Microsoft.Extensions.Http.Resilienceao 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.
Em seguida, adicione a seguinte instrução using na classe de inicialização do seu 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 seu serviço HttpClient. O .NET fornece essa configuração pronta para uso combinando várias estratégias.
O manipulador de solicitações passa por cada uma dessas estratégias 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 de 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 o pedido demorar mais do que este tempo, será lançada uma exceção.
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 nova tentativa 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);
});
Este código altera os padrões da estratégia de repetição para ter um número máximo de tentativas de 10, utilizar uma retirada linear e um atraso 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 causarão uma exceção. Isso é um erro porque a configuração de retrocesso exponencial faria com que o tempo total para concluir as 10 tentativas fosse de 2.046 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 | Descrição |
|---|---|
| Tempo Total de Espera | A quantidade total de tempo 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 expira. O padrão é nulo. |
| Opções de repetição | Descrição |
|---|---|
| ContagemDeRepetições | O número máximo de tentativas. O padrão é 3. |
| TipoDeRetrocesso | O tipo de recuo a ser usado. Você pode escolher entre linear e exponencial. O padrão é exponencial. |
| UseJitter | Deve-se adicionar jitter ao backoff? O jitter adiciona aleatoriedade ao atraso para ajudar a reduzir picos na carga. O padrão é verdadeiro. |
| BaseDelay | O atraso entre as tentativas de repetição. O padrão é 2 segundos. |
| Opções de disjuntor | Descrição |
|---|---|
| Duração da Pausa | 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. |
| Duração de Amostragem | A duração do tempo durante o qual a taxa de falha é calculada. O padrão é 30 segundos. |
| Fechado | Uma função de callback que é invocada quando o circuito está fechado. O padrão é null. |
| OnHalfOpened | Uma função de callback que é invocada quando o circuito está semiaberto. O padrão é null. |
| OnOpened | Uma função de callback que é chamada quando o circuito é aberto. O padrão é null. |
| Opções de tempo limite de tentativa | Descrição |
|---|---|
| Tempo de espera | 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 é nulo. |
O diagrama de sequência mostra como cada uma das estratégias funcionam juntas 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. 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 o pedido demorar mais do que este tempo, será lançada uma exceção.