¿Qué es Polly y para qué sirve?
\n\nPolly es una biblioteca potente y flexible para .NET (C#, F#, VB.NET), diseñada para manejar fallos temporales y mejorar la tolerancia a fallos de las aplicaciones. Implementa patrones de resiliencia como reintentos (Retry), interruptor de circuito (Circuit Breaker), tiempos de espera (Timeout), aislamiento (Bulkhead Isolation) y almacenamiento en caché (Cache).
\n\nEn el mundo moderno de la arquitectura de microservicios y la computación en la nube, las aplicaciones interactúan constantemente con recursos externos: bases de datos, servicios web, API. Estas interacciones pueden ser poco fiables: errores de red, indisponibilidad temporal del servicio, superación de límites de solicitudes. Polly permite manejar estas situaciones de forma elegante, sin escribir código engorroso con bloques try-catch.
\n\nEscenarios principales de uso:
\n- \n
- Retry (Reintentos): Reintentar automáticamente una operación cuando ocurre un error temporal. \n
- Circuit Breaker (Interruptor de circuito): Detener los intentos de llamada si el servicio produce errores constantemente, para darle tiempo de recuperarse. \n
- Timeout (Tiempo de espera): Limitar el tiempo de ejecución de una operación. \n
- Bulkhead (Aislamiento): Limitar el número de operaciones paralelas para que una operación "mala" no bloquee todo el grupo de subprocesos. \n
- Cache (Almacenamiento en caché): Almacenar en caché los resultados de operaciones exitosas. \n
- Fallback (Plan de respaldo): Ejecutar una acción alternativa en caso de fallo. \n
Instalación de Polly
\n\nPolly se distribuye a través de NuGet, el gestor de paquetes para .NET. Se puede instalar de varias maneras:
\n\nA través de Package Manager Console (Visual Studio)
\nInstall-Package Polly\n\nA través de .NET CLI
\ndotnet add package Polly\n\nA través de PackageReference (en el archivo .csproj)
\n<PackageReference Include="Polly" Version="8.2.0" />\n\nDespués de la instalación, agregue la directiva using en su 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\nInicio rápido con un ejemplo de código
\n\nConsideremos un ejemplo sencillo: tenemos un método que llama a una API externa y queremos reintentar la llamada 3 veces si se produce una excepción.
\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 // Creamos la política de reintentos\n _retryPolicy = Policy\n .Handle<HttpRequestException>() // Qué excepciones manejar\n .Or<TimeoutException>() // O tiempo de espera\n .WaitAndRetryAsync(\n 3, // Número de intentos\n retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)), // Retardo exponencial\n onRetry: (exception, timeSpan, retryCount, context) =>\n {\n Console.WriteLine($"Intento {retryCount} fallido. Reintentando en {timeSpan.Seconds} seg. Error: {exception.Message}");\n }\n );\n }\n\n public async Task<string> GetDataAsync(string url)\n {\n // Ejecutamos la solicitud usando la 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 También en la biblioteca
Configuración de aplicaciones C# (.NET): bibliotecas y herramientas
Trabajo con Markdown en C++: bibliotecas, analizadores y herramientas
Envío de correo electrónico en JavaScript (Node.js): nodemailer, sendgrid, mailgun
Cliente HTTP para Swift (iOS/macOS): mejores bibliotecas para trabajar con la red
Envío de SMS en Go (Golang): API bibliotecas golang-sms