Tratamento de Falhas com .NET + Polly: implementando o uso de Wait and Retry
Recentemente publiquei neste blog um artigo abordando o padrão Circuit Breaker em aplicações .NET, fazendo uso para isto da biblioteca Polly:
Tratamento de Falhas com .NET + Polly: implementando o padrão Circuit Breaker
Também demonstrei anteriormente como implementar o pattern Retry com Polly:
.NET 5 + JWT + Polly + Refit: consumindo APIs seguras com simplicidade e resiliência
.NET 5 + Polly: melhorando o tratamento de falhas em exemplos práticos
Temos em Polly o suporte a diversos padrões para tratamento de falhas e estratégias de resiliência (além do próprio Circuit Breaker), com a utilização do pattern Retry constituindo uma das escolhas mais comuns. Mas será que poderemos realizar novas tentativas imediatamente sempre, partindo da suposição que em milissegundos um recurso responsável por uma falha terá se recuperado?
Em muitos cenários a resposta a este questionamento será não. A solução então passará pela configuração de intervalos de espera, a fim de evitar novos erros em um curtíssimo espaço de tempo.
E como o uso de Polly fica diante de tudo isso?
Dentre as possibilidades de implementação do padrão Retry com Polly temos o método WaitAndRetryAsync. Na listagem a seguir está o código que define o tipo WaitAndRetryExtensions, com o mesmo exemplificando a utilização desta alternativa:
- Uma instância de AsyncRetryPolicy (namespace Polly.Retry) será gerada a partir de CreateWaitAndRetryPolicy;
- O método WaitAndRetryAsync recebe como parâmetro um IEnumerable com instâncias de TimeSpan e que foi informado ao acionar CreateWaitAndRetryPolicy. Estes intervalos correspondem aos tempos de espera antes de cada retentativa;
- O parâmetro onRetry contém o código a ser executado a cada retentativa.
Na classe Program o método CreateWaitAndRetryPolicy foi acionado, a fim de configurar uma dependência baseada em AsyncRetryPolicy (linha 21) e levando em conta 3 intervalos de espera diferentes (1, 4 e 7 segundos):
Finalmente chegamos à implementação do tipo Worker:
- A dependência configurada na classe Program será injetada no construtor de Worker (linhas 22 e 26);
- Este objeto então servirá de base para a execução de chamadas a uma API REST de contagem de acessos, empregando para isto o tratamento de falhas baseado em Wait and Retry (linhas 38 a 42).
O código deste exemplo (um Worker Service criado com .NET 5, além da API REST para testes) foi disponibilizado no GitHub:
https://github.com/renatogroffe/DotNet5-Worker-Polly-Wait-Retry_ConsumoAPIContagem
Na próxima imagem temos o exemplo de uma única retentativa, após uma falha na API REST que não mais ocorreu após 1 segundo de espera:
Retentativas de acesso respeitando os intervalos de espera ocorrerão logo depois de uma interrupção forçada na API de contagem, com o fluxo retornando ao normal após uma nova execução desta aplicação Web:
E concluo este post com um convite…
Dia 25/08 (quarta) às 21:00 — horário de Brasília — teremos mais um evento online e gratuito no Canal .NET.
Ao longo desta live abordarei dicas, truques e alternativas úteis para o desenvolvimento Back-End e de APIs REST com .NET, ASP.NET Core, Azure Functions. Acompanhe para saber mais sobre o uso de diferentes frameworks, serviços na nuvem, mensageria, bancos de dados e boas práticas de forma a facilitar e tornar mais dinâmica a implementação de soluções baseadas na plataforma .NET no seu dia a dia.
Para participar faça sua inscrição no link a seguir, a transmissão acontecerá via YouTube: