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 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:

  1. Adicione o pacote Microsoft.Extensions.Http.Resilience 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.

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.

Um diagrama mostrando as estratégias incluídas no manipulador padrão de resiliência: tempo limite geral, nova tentativa, bulkhead, disjuntor e tempo limite de tentativa.

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.

Um diagrama de sequência mostrando o fluxo de eventos em um aplicativo usando uma estratégia de resiliência.

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.