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