הסבר על Circuit Breaker דרך כישלון
נתקלתי בבעיה בלתי צפויה לפני כמה ימים.
התסכול היה גדול. רציתי לתקן את הבעיה. הסקרנות דחפה אותי להמשיך הלאה.
ישבתי שוב עם הבעיה. מצאתי את הפתרון. הוא נקרא circuit breaker.
בתוכנה, circuit breaker מונע מכישלון בודד להפיל את כל המערכת שלך. הוא עובד כמו המפסק בלוח החשמל בבית.
ל-circuit breaker יש שלושה מצבים:
- CLOSED: הכל עובד. כל הבקשות עוברות. המערכת עוקבת אחר הכשלים. אם מספר הכשלים מגיע לסף מסוים, המעגל נפתח.
- OPEN: המערכת עוצרת את כל הבקשות באופן מיידי. זה נותן לשירות שנכשל זמן להתאושש.
- HALF_OPEN: המערכת מאפשרת מספר בקשות בדיקה. אם הן מצליחות, המעגל נסגר. אם הן נכשלות, המעגל נפתח שוב.
הנה מימוש פשוט בקוד:
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
}
}
}
המנגנון הזה פתר לי את הבעיה האחרונה שלי. הוא מונע משיטפון של שגיאות להפיל את האפליקציה שלך.
אנא שתפו את המחשבות שלכם בתגובות. אני עדיין לומד.
מקור: https://dev.to/neel-vekariya/circuit-breaker-explained-through-real-failure-experience-3aeg