In un sistema distribuito, tutto fallisce prima o poi. I modelli di resilienza impediscono a un singolo guasto di propagarsi a cascata fino a un'interruzione completa.
In un sistema distribuito, tutto fallisce prima o poi. I modelli di resilienza impediscono a un singolo guasto di propagarsi a cascata fino a un'interruzione 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.
Retry senza backoff amplificano il carico su un servizio già in difficoltà (una retry storm). Aggiungi sempre backoff, jitter e un limite al numero di tentativi.
Questi modelli trasformano un inevitabile guasto di un singolo servizio in una funzionalità degradata anziché un'interruzione a livello di sito.
Funzionano insieme: i timeout limitano l'attesa, i circuit breaker smettono di bombardare servizi morti, i bulkhead contenono il raggio di esplosione, e i retry si recuperano da piccoli errori — omettere uno qualsiasi e i guasti continueranno a propagarsi.