อธิบายเรื่อง 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