Circuit Breaker
Protege al sistema de fallos en cascada cortando llamadas a un servicio en problemas.
Contexto
Una dependencia (API externa, BD, cache) empieza a fallar/timeoutear. Tu app sigue llamándola, agotando hilos y propagando latencia.
Problema
- Llamar a algo que se sabe roto desperdicia recursos.
- Reintentos masivos empeoran el incidente.
Solución
Un breaker monitorea fallos. Si superan el umbral pasa a Open y rechaza llamadas inmediatamente. Tras un tiempo prueba en Half-Open y decide.
#Ejemplo en C# — Polly
using Polly;
using Polly.CircuitBreaker;
var breaker = Policy
.Handle<HttpRequestException>()
.CircuitBreakerAsync(
exceptionsAllowedBeforeBreaking: 5,
durationOfBreak: TimeSpan.FromSeconds(30),
onBreak: (ex, ts) => log.LogWarning("Breaker abierto {Span}", ts),
onReset: () => log.LogInformation("Breaker cerrado"));
var response = await breaker.ExecuteAsync(() => httpClient.GetAsync("/api/orders"));Tradeoffs
| Pro | Contra |
|---|---|
| Evita cascadas de fallos | Algunas requests fallan rápido aunque el servicio se haya recuperado |
| Da tiempo al servicio remoto a recuperarse | Configurar umbrales requiere observabilidad |
#Variantes
- Bulkhead (aísla pools de hilos por dependencia).
- Retry con jitter exponencial (a menudo combinado con Circuit Breaker).
#extra #resilience