Em um sistema distribuído, tudo falha eventualmente. Os padrões de resiliência impedem que uma única falha em cascata se torne uma interrupção completa.
Em um sistema distribuído, tudo falha eventualmente. Os padrões de resiliência impedem que uma única falha em cascata se torne uma interrupção completa.
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.
Tentativas novamente sem backoff amplificam a carga em um serviço já sobrecarregado (uma tempestade de tentativas). Sempre adicione backoff, jitter e um limite de tentativas.
Esses padrões são o que transformam uma falha inevitável de um único serviço em um recurso degradado em vez de uma interrupção em todo o site.
Eles funcionam juntos: os timeouts limitam a espera, os circuit breakers impedem que os serviços não funcionem, os bulkheads contêm o raio de explosão e as tentativas se recuperam de falhas — omita qualquer uma e as falhas ainda cascateiam.