อธิบายเรื่อง Circuit Breaker ผ่านประสบการณ์ความล้มเหลว
เมื่อไม่กี่วันที่ผ่านมา ผมเจอกับปัญหาที่ไม่คาดคิด
ความหงุดหงิดถาโถมเข้ามาหาผมอย่างหนัก ผมอยากจะแก้ไขมัน และความอยากรู้อยากเห็นก็ผลักดันให้ผมต้องเดินหน้าต่อไป
ผมกลับมานั่งจมอยู่กับปัญหานั้นอีกครั้ง จนในที่สุดผมก็พบทางออก สิ่งนั้นเรียกว่า circuit breaker
ในทางซอฟต์แวร์ circuit breaker จะช่วยป้องกันไม่ให้ความล้มเหลวเพียงจุดเดียวทำให้ระบบทั้งหมดของคุณพังลง มันทำงานเหมือนกับเบรกเกอร์ในบ้านของคุณ
circuit breaker มี 3 สถานะ:
- CLOSED: ทุกอย่างทำงานปกติ คำขอทั้งหมดสามารถผ่านไปได้ ระบบจะติดตามความล้มเหลว หากความล้มเหลวถึงขีดจำกัด วงจรจะเปิดออก (opens)
- OPEN: ระบบจะหยุดการส่งคำขอทั้งหมดทันที เพื่อให้บริการที่กำลังมีปัญหาได้มีเวลาในการกู้คืน (recover)
- HALF_OPEN: ระบบจะอนุญาตให้มีการส่งคำขอทดสอบจำนวนหนึ่ง หากสำเร็จ วงจรจะปิดลง (closes) หากล้มเหลว วงจรจะเปิดออก (opens) อีกครั้ง
นี่คือตัวอย่างการเขียนโค้ดแบบง่ายๆ:
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