En un sistema distribuido, todo falla eventualmente. Los patrones de resiliencia evitan que una sola falla se propague en un apagón completo.
En un sistema distribuido, todo falla eventualmente. Los patrones de resiliencia evitan que una sola falla se propague en un apagón completo.
const breaker = new CircuitBreaker(callPaymentService, {
timeout: 3000, // fail the call after 3s
errorThresholdPercentage: 50, // open if >50% of calls fail
resetTimeout: 10000 // after 10s, try one request (half-open)
});
breaker.fallback(() => ({ status: 'queued' })); // graceful degradation
CLOSED ──(failures exceed threshold)──▶ OPEN
▲ │ (after resetTimeout)
│ (trial succeeds) ▼
└────────────── HALF-OPEN ◀──────────────┘
(one trial request)
[ pool A: 10 threads ] → payment calls
[ pool B: 10 threads ] → search calls
If search hangs, it drains pool B only — payments keep working.
Reintentos sin backoff amplifican la carga en un servicio que ya está luchando (una tormenta de reintentos). Siempre añade backoff, jitter y un límite de reintentos.
Estos patrones son lo que convierten una falla inevitable de un único servicio en una característica degradada en lugar de una interrupción en todo el sitio.
Trabajan juntos: los timeouts limitan la espera, los circuit breakers detienen las llamadas constantes a servicios muertos, los bulkheads contienen el radio de explosión y los reintentos se recuperan de fallos momentáneos — si omites cualquiera de ellos, las falles igualmente se propagan.