ব্যর্থতার মাধ্যমে সার্কিট ব্রেকারের ব্যাখ্যা

কয়েক দিন আগে আমি একটি অপ্রত্যাশিত সমস্যার সম্মুখীন হয়েছিলাম।

হতাশা আমাকে দারুণভাবে কাবু করে ফেলেছিল। আমি এটি সমাধান করতে চেয়েছিলাম। কৌতূহল আমাকে চালিয়ে যেতে বাধ্য করেছিল।

আমি আবারও সমস্যাটি নিয়ে বসলাম। আমি সমাধানটি খুঁজে পেলাম। একে বলা হয় সার্কিট ব্রেকার।

সফটওয়্যারের ক্ষেত্রে, একটি সার্কিট ব্রেকার একটি মাত্র ব্যর্থতা আপনার পুরো সিস্টেমকে ক্র্যাশ করা থেকে রক্ষা করে। এটি আপনার বাড়ির ব্রেকারের মতোই কাজ করে।

একটি সার্কিট ব্রেকারের তিনটি অবস্থা রয়েছে:

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

এই মেকানিজমটি আমার সাম্প্রতিক সমস্যাটি সমাধান করেছে। এটি ত্রুটির বন্যা আপনার অ্যাপ্লিকেশনকে অচল করে দেওয়া থেকে রক্ষা করে।

অনুগ্রহ করে কমেন্টে আপনার মতামত জানান। আমি এখনও শিখছি।

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