In een gedistribueerd systeem faalt alles uiteindelijk. Resilience-patronen voorkomen dat een enkele fout zich uitbreidt tot een volledige storing.
In een gedistribueerd systeem faalt alles uiteindelijk. Resilience-patronen voorkomen dat een enkele fout zich uitbreidt tot een volledige storing.
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.
Retries zonder backoff vergroten de belasting op een al overbelaste service (een retry storm). Voeg altijd backoff, jitter en een retry-limiet toe.
Deze patronen transformeren een onvermijdelijke fout van één service in een verslechterde functie in plaats van een storing op sitebreedte.
Ze werken samen: timeouts beperken wachttijden, circuit breakers voorkomen dat slechte services worden bestookt, bulkheads beperken de effectomvang, en retries herstellen zich van kleine storing — laat er één achterwege en storingen verspreiden zich nog steeds.