𝗖𝗶𝗿𝗰𝘂𝗶𝘁 𝗕𝗿𝗲𝗮𝗸𝗲𝗿 𝗗𝗶𝗷𝗲𝗹𝗮𝘀𝗸𝗮𝗻 𝗠𝗲𝗹𝗮𝗹𝘂𝗶 𝗞𝗲𝗴𝗮𝗴𝗮𝗹𝗮𝗻

Saya menghadapi masalah yang tidak dijangka beberapa hari yang lalu.

Rasa kecewa menyelubungi saya. Saya mahu menyelesaikannya. Rasa ingin tahu mendorong saya untuk terus mencuba.

Saya meneliti semula masalah tersebut. Saya menemui penyelesaiannya. Ia dipanggil circuit breaker.

Dalam perisian, circuit breaker menghalang kegagalan tunggal daripada meruntuhkan keseluruhan sistem anda. Ia berfungsi seperti pemutus litar di rumah anda.

Circuit breaker mempunyai tiga keadaan:

  • CLOSED: Segalanya berfungsi. Semua permintaan diproses. Sistem menjejak kegagalan. Jika kegagalan mencapai had, litar akan terbuka.
  • OPEN: Sistem menghentikan semua permintaan dengan serta-merta. Ini memberi masa kepada perkhidmatan yang gagal untuk pulih.
  • HALF_OPEN: Sistem membenarkan beberapa permintaan ujian. Jika berjaya, litar akan ditutup. Jika gagal, litar akan terbuka semula.

Here is a simple implementation in code:

    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
        }
    }
}

Mekanisme ini telah menyelesaikan masalah saya baru-baru ini. Ia menghalang lambakan ralat daripada melumpuhkan aplikasi anda.

Sila kongsikan pendapat anda di ruangan komen. Saya masih belajar.

Sumber: https://dev.to/neel-vekariya/circuit-breaker-explained-through-real-failure-experience-3aeg