Hata Üzerinden Açıklanan Circuit Breaker

Birkaç gün önce beklenmedik bir sorunla karşılaştım.

Büyük bir hayal kırıklığı yaşadım. Bunu düzeltmek istedim. Merakım beni devam etmeye zorladı.

Sorunla tekrar baş başa oturdum. Çözümü buldum. Buna circuit breaker deniyor.

Yazılımda bir circuit breaker, tek bir hatanın tüm sisteminizi çökertmesini engeller. Evinizdeki sigorta gibi çalışır.

Bir circuit breaker üç duruma sahiptir:

  • KAPALI (CLOSED): Her şey çalışır. Tüm istekler iletilir. Sistem hataları takip eder. Hatalar bir sınıra ulaşırsa devre açılır.
  • AÇIK (OPEN): Sistem tüm istekleri anında durdurur. Bu, hata veren servisin toparlanması için zaman tanır.
  • YARI AÇIK (HALF_OPEN): Sistem birkaç test isteğine izin verir. Eğer başarılı olurlarsa devre kapanır. Başarısız olurlarsa devre tekrar açılır.

İşte kod ile basit bir uygulama:

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

Bu mekanizma son yaşadığım sorunu çözdü. Hata selinin uygulamanızı çökertmesini engeller.

Lütfen düşüncelerinizi yorumlarda paylaşın. Hala öğreniyorum.

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