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.

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.

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.

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

Prompt: UML diagram of retry pattern, clean vector layout.

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.