Polly para C# (.NET): guía completa con ejemplos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

¿Qué es Polly y para qué sirve?

\n\n

Polly 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\n

En 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\n

Escenarios 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
\n\n

Instalación de Polly

\n\n

Polly se distribuye a través de NuGet, el gestor de paquetes para .NET. Se puede instalar de varias maneras:

\n\n

A través de Package Manager Console (Visual Studio)

\n
Install-Package Polly
\n\n

A través de .NET CLI

\n
dotnet add package Polly
\n\n

A través de PackageReference (en el archivo .csproj)

\n
<PackageReference Include="Polly" Version="8.2.0" />
\n\n

Después de la instalación, agregue la directiva using en su código:

\n
using Polly;\nusing Polly.Retry;\nusing Polly.CircuitBreaker;\nusing Polly.Timeout;\nusing Polly.Bulkhead;\nusing Polly.Caching;\nusing Polly.Fallback;\nusing Polly.Wrap;
\n\n

Inicio rápido con un ejemplo de código

\n\n

Consideremos 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\n
using 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                    

Recommendations