In einem verteilten System schlägt alles irgendwann fehl. Resilienzmuster verhindern, dass ein einzelner Fehler zu einem vollständigen Ausfall führt.
In einem verteilten System schlägt alles irgendwann fehl. Resilienzmuster verhindern, dass ein einzelner Fehler zu einem vollständigen Ausfall führt.
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 ohne Backoff erhöhen die Last auf einen bereits überforderten Service (Retry-Sturm). Füge immer Backoff, Jitter und ein Retry-Limit hinzu.
Diese Muster verwandeln einen unvermeidlichen Single-Service-Fehler in ein beeinträchtigtes Feature statt in einen vollständigen Systemausfall.
Sie arbeiten zusammen: Timeouts begrenzen das Warten, Circuit Breaker stoppen wiederholte Aufrufe an tote Services, Bulkheads begrenzen den Explosionsradius und Retries erholen sich von kurzzeitigen Störungen — wenn du einen auslässt, verbreiten sich Fehler trotzdem weiter.