Le Circuit Breaker expliqué par l'échec
J'ai été confronté à un problème inattendu il y a quelques jours.
La frustration m'a frappé de plein fouet. Je voulais le résoudre. La curiosité m'a poussé à continuer.
Je me suis replongé dans le problème. J'ai trouvé la solution. Elle s'appelle le circuit breaker.
En informatique, un circuit breaker empêche une seule défaillance de faire planter l'ensemble de votre système. Il fonctionne comme le disjoncteur de votre maison.
Un circuit breaker possède trois états :
- CLOSED : Tout fonctionne. Toutes les requêtes passent. Le système suit les échecs. Si les échecs atteignent une limite, le circuit s'ouvre.
- OPEN : Le système interrompt immédiatement toutes les requêtes. Cela laisse au service défaillant le temps de se rétablir.
- HALF_OPEN : Le système autorise quelques requêtes de test. Si elles réussissent, le circuit se ferme. Si elles échouent, le circuit s'ouvre à nouveau.
Voici une implémentation simple en code :
export class CircuitBreaker {
constructor(failureThreshold, cooldownMs) {
this.failureThreshold = failureThreshold
this.cooldownMs = cooldownMs
this.state = "CLOSED"
this.failureCount = 0
this.lastFailureTime = null
}
openCircuit() {
this.state = "OPEN"
this.lastFailureTime = Date.now()
}
closeCircuit() {
this.state = "CLOSED"
this.failureCount = 0
this.lastFailureTime = null
}
halfOpenCircuit() {
this.state = "HALF_OPEN"
}
async execute(fn) {
if (this.state === "OPEN") {
const cooldownExpired = Date.now() - this.lastFailureTime >= this.cooldownMs
if (!cooldownExpired) {
throw new Error("Circuit is open.")
}
this.halfOpenCircuit();
}
try {
const result = await fn()
if (this.state === "HALF_OPEN") {
this.closeCircuit()
}
return result;
} catch (error) {
if (this.state === "HALF_OPEN") {
this.openCircuit()
throw error;
}
this.failureCount++
if (this.failureCount >= this.failureThreshold) {
this.openCircuit()
}
throw error
}
}
}
Ce mécanisme a résolu mon problème récent. Il empêche le déluge d'erreurs de faire planter votre application.
N'hésitez pas à partager vos réflexions dans les commentaires. Je suis encore en phase d'apprentissage.
Source : https://dev.to/neel-vekariya/circuit-breaker-explained-through-real-failure-experience-3aeg