O Polly é uma biblioteca que ajuda a adicionar resiliência a chamadas externas em sua aplicação, oferecendo mecanismos como retry, circuit breaker, fallback, e outros padrões de resiliência. Isso é útil quando sua aplicação precisa lidar com falhas temporárias em serviços externos ou redes. Neste exemplo, vamos demonstrar como implementar uma política de retry simples usando Polly.
Bibliotecas:
Para usar a biblioteca Polly, instale o seguinte pacote NuGet no seu projeto:
Install-Package Polly
Código de Exemplo:
using Polly;
using System;
using System.Net.Http;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
// Definindo uma política de retry que tenta 3 vezes com um intervalo de 2 segundos entre tentativas
var retryPolicy = Policy
.Handle<HttpRequestException>()
.WaitAndRetryAsync(3, retryAttempt => TimeSpan.FromSeconds(2),
(exception, timeSpan, retryCount, context) =>
{
Console.WriteLine($"Tentativa {retryCount} falhou. Tentando novamente em {timeSpan.TotalSeconds} segundos...");
});
// Fazendo uma chamada HTTP com retry
HttpClient httpClient = new HttpClient();
var url = "https://exemplo-api.com/falha";
try
{
await retryPolicy.ExecuteAsync(async () =>
{
Console.WriteLine("Fazendo requisição...");
var response = await httpClient.GetAsync(url);
response.EnsureSuccessStatusCode();
Console.WriteLine("Requisição bem-sucedida!");
});
}
catch (Exception ex)
{
Console.WriteLine($"Todas as tentativas falharam: {ex.Message}");
}
}
}
Explicação do Código:
Neste exemplo, utilizamos o Polly para definir uma política de retry que tenta três vezes, esperando dois segundos entre cada tentativa, quando ocorre uma exceção HttpRequestException. A função WaitAndRetryAsync lida com a lógica de retry e executa a chamada HTTP até que ela seja bem-sucedida ou até que o número máximo de tentativas seja atingido. Se todas as tentativas falharem, a exceção será capturada e exibida no console.
Conclusão:
O Polly é uma poderosa biblioteca para melhorar a resiliência das aplicações, fornecendo um conjunto de padrões de tratamento de falhas, como retry, circuit breaker e fallback. Isso permite que sua aplicação lide melhor com falhas temporárias de rede ou de serviços externos, aumentando a robustez e a confiabilidade.
Código fonte: GitHub