𝗖𝗶𝗿𝗰𝘂𝗶𝘁 𝗕𝗿𝗲𝗮𝗸𝗲𝗿 𝗘𝘅𝗽𝗹𝗮𝗶𝗻𝗲𝗱 𝗧𝗵𝗿𝗼𝘂𝗴𝗵 𝗙𝗮𝗶𝗹𝘂𝗿𝗲

چند روز پیش با یک مشکل غیرمنتظره روبرو شدم.

ناامیدی شدیدی به سراغم آمد. می‌خواستم آن را حل کنم. کنجکاوی مرا مجبور کرد که ادامه دهم.

دوباره با آن مشکل روبرو شدم. راه حل را پیدا کردم. نام آن circuit breaker است.

در نرم‌افزار، یک circuit breaker از فروپاشی کل سیستم شما بر اثر یک شکست واحد جلوگیری می‌کند. این دقیقاً مانند فیوز (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
        }
    }
}

این مکانیزم مشکل اخیر من را حل کرد. این کار از هجوم خطاها که می‌تواند باعث از کار افتادن اپلیکیشن شما شود، جلوگیری می‌کند.

لطفاً نظرات خود را در بخش کامنت‌ها به اشتراک بگذارید. من هنوز در حال یادگیری هستم.

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