Dans un système distribué, tout finit par échouer. Les modèles de résilience empêchent une défaillance isolée de se propager en une panne générale.
Dans un système distribué, tout finit par échouer. Les modèles de résilience empêchent une défaillance isolée de se propager en une panne générale.
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.
Les retries sans backoff amplifient la charge sur un service déjà en difficulté (une tempête de retries). Toujours ajouter backoff, jitter et une limite de retries.
Ces modèles sont ce qui transforme une défaillance inévitable d'un seul service en une dégradation de fonctionnalité plutôt qu'en une panne globale du site.
Ils fonctionnent ensemble : les timeouts limitent l'attente, les circuit breakers arrêtent de marteler les services morts, les bulkheads contiennent le rayon d'explosion, et les retries récupèrent des accrocs — en omettre un et les défaillances se propagent toujours.