Retry Pattern en C#: Guía Completa

Introducción: Errores transitorios

Retry se usa cuando un fallo es temporal: un timeout, una red saturada o un recurso ocupado.

La clave es reintentar con backoff y jitter para no saturar aún más al sistema.

Bien usado, aumenta la confiabilidad; mal usado, amplifica los problemas.

Retry
Prompt: Retry arrows with backoff, clean minimal style.

1. Naturaleza: Oleaje intermitente

Las olas dificultan el paso, pero con el tiempo suelen calmarse.

Un reintento inteligente espera antes de volver a intentar, en lugar de insistir de inmediato.

Oleaje
Prompt: Ocean waves calming down, soft illustration.

2. Mundo Real: Reintentos de pago

Cuando un pago falla por tiempo de espera, se reintenta segundos después.

Si el banco sigue sin responder, se aplica un backoff creciente para no saturar el sistema.

Pagos
Prompt: Payment retry flow, clean flat style.

3. Implementación en C#: Código Paso a Paso

public async Task RetryAsync(Func> action)
{
    int retries = 3;
    int delayMs = 200;
    for (int i = 0; i < retries; i++)
    {
        try { return await action(); }
        catch { await Task.Delay(delayMs); delayMs *= 2; }
    }
    throw new Exception("Fallo persistente");
}

Agrega jitter para evitar que múltiples clientes reintenten al mismo tiempo.

Combina con Circuit Breaker para evitar reintentos infinitos.

4. Retry vs Circuit Breaker

Retry intenta recuperar fallos temporales; Circuit Breaker detiene el flujo cuando el fallo es persistente.

Se complementan: Retry mejora la recuperación; Circuit Breaker evita colapsos.

5. Diagrama UML

UML Retry
Prompt: UML diagram of retry pattern, clean vector layout.
Flujo Retry
Prompt: Retry backoff timeline, minimal infographic style.

⚠️ Cuándo NO Usar Retry

  • Si el fallo es determinístico (por ejemplo, validación).
  • Si el sistema ya está saturado.
  • Si no hay límites de reintentos ni backoff.

💪 Ejercicio

Implementa un Retry con backoff exponencial y jitter en un cliente HTTP.

Conclusión

Retry es esencial para robustecer operaciones con fallos transitorios.

Usado con límites y backoff, mejora la resiliencia sin causar tormentas de reintentos.