O que é Polly e para que serve?
\n\nPolly é uma biblioteca poderosa e flexível para .NET (C#, F#, VB.NET), projetada para lidar com falhas temporárias e aumentar a resiliência de aplicações. Ela implementa padrões de resiliência, como novas tentativas (Retry), disjuntor (Circuit Breaker), timeouts (Timeout), isolamento (Bulkhead Isolation) e cache (Cache).
\n\nNo mundo moderno da arquitetura de microsserviços e computação em nuvem, as aplicações interagem constantemente com recursos externos: bancos de dados, serviços web, APIs. Essas interações podem ser não confiáveis — erros de rede, indisponibilidade temporária do serviço, exceder limites de requisições. Polly permite lidar com essas situações de forma elegante, sem escrever código extenso com blocos try-catch.
\n\nPrincipais cenários de uso:
\n- \n
- Retry (Novas tentativas): Repetir automaticamente a operação em caso de erro temporário. \n
- Circuit Breaker (Disjuntor): Interromper as tentativas de chamada se o serviço estiver gerando erros constantemente, para dar tempo de recuperação. \n
- Timeout (Tempo limite): Limitar o tempo de execução de uma operação. \n
- Bulkhead (Isolamento): Limitar o número de operações paralelas para que uma operação "ruim" não bloqueie todo o pool de threads. \n
- Cache (Cache): Armazenar em cache os resultados de operações bem-sucedidas. \n
- Fallback (Plano alternativo): Executar uma ação alternativa em caso de falha. \n
Instalação do Polly
\n\nPolly é distribuído via NuGet — o gerenciador de pacotes para .NET. Pode ser instalado de várias maneiras:
\n\nVia Package Manager Console (Visual Studio)
\nInstall-Package Polly\n\nVia .NET CLI
\ndotnet add package Polly\n\nVia PackageReference (no arquivo .csproj)
\n<PackageReference Include="Polly" Version="8.2.0" />\n\nApós a instalação, adicione a diretiva using ao seu código:
\nusing Polly;\nusing Polly.Retry;\nusing Polly.CircuitBreaker;\nusing Polly.Timeout;\nusing Polly.Bulkhead;\nusing Polly.Caching;\nusing Polly.Fallback;\nusing Polly.Wrap;\n\nInício rápido com exemplo de código
\n\nVamos considerar um exemplo simples: temos um método que chama uma API externa e queremos repetir a chamada 3 vezes se ocorrer uma exceção.
\n\nusing System;\nusing System.Net.Http;\nusing System.Threading.Tasks;\nusing Polly;\nusing Polly.Retry;\n\npublic class ApiClient\n{\n private readonly HttpClient _httpClient;\n private readonly AsyncRetryPolicy _retryPolicy;\n\n public ApiClient()\n {\n _httpClient = new HttpClient();\n \n // Criando a política de novas tentativas\n _retryPolicy = Policy\n .Handle<HttpRequestException>() // Quais exceções tratar\n .Or<TimeoutException>() // Ou timeout\n .WaitAndRetryAsync(\n 3, // Número de tentativas\n retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)), // Atraso exponencial\n onRetry: (exception, timeSpan, retryCount, context) =>\n {\n Console.WriteLine($"Tentativa {retryCount} falhou. Repetindo em {timeSpan.Seconds} seg. Erro: {exception.Message}");\n }\n );\n }\n\n public async Task<string> GetDataAsync(string url)\n {\n // Executando a requisição usando a política\n return await _retryPolicy.ExecuteAsync(async () =>\n {\n var response = await _httpClient.GetAsync(url);\n response.EnsureSuccessStatusCode();\n return await response.Content.ReadAsStringAsync();\n });\n }\n}\n\n// Uso\npublic class Program\n{\n public stat Também na biblioteca
Newtonsoft.Json para C# (.NET): guia completo com exemplos
Métricas Prometheus em Kotlin: integração com Micrometer e Ktor
Envio de email em Java: biblioteca Jakarta Mail (JavaMail)
Trabalho com imagens em PHP: redimensionamento e corte (resize, crop)
Agendador de Tarefas Kotlin: kotlinx.coroutines e bibliotecas para tarefas em segundo plano