Σε ένα κατανεμημένο σύστημα, τα πάντα αποτυγχάνουν τελικά. Τα μοτίβα ανθεκτικότητας αποτρέπουν μια μόνο αποτυχία από να προκαλέσει πλήρη διακοπή.
Σε ένα κατανεμημένο σύστημα, τα πάντα αποτυγχάνουν τελικά. Τα μοτίβα ανθεκτικότητας αποτρέπουν μια μόνο αποτυχία από να προκαλέσει πλήρη διακοπή.
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 χωρίς backoff ενισχύει το φορτίο σε ένα ήδη πολιορκημένο service (retry storm). Πάντα προσθέσε backoff, jitter και ένα όριο retry.
Αυτά τα μοτίβα είναι αυτά που μετατρέπουν μια αναπόφευκτη αποτυχία ενός service σε μια υποβαθμισμένη δυνατότητα αντί για διακοπή σε ολόκληρο τον ιστότοπο.
Λειτουργούν μαζί: τα timeouts περιορίζουν την αναμονή, τα circuit breakers σταματούν τη σφυροκόπηση νεκρών services, τα bulkheads περιορίζουν την ακτίνα έκρηξης και τα retries ανάκαμψης από σποραδικά σφάλματα — παραλείψτε ένα και οι αποτυχίες εξακολουθούν να διαδίδονται.