ਫੇਲ੍ਹ ਹੋਣ ਦੇ ਅਨੁਭਵ ਰਾਹੀਂ ਸਰਕਟ ਬ੍ਰੇਕਰ (Circuit Breaker) ਦੀ ਵਿਆਖਿਆ

ਕੁਝ ਦਿਨ ਪਹਿਲਾਂ ਮੇਰਾ ਸਾਹਮਣਾ ਇੱਕ ਅਣਪਛਾਤੀ ਸਮੱਸਿਆ ਨਾਲ ਹੋਇਆ।

ਮੈਂ ਬਹੁਤ ਨਿਰਾਸ਼ ਹੋਇਆ। ਮੈਂ ਇਸਨੂੰ ਠੀਕ ਕਰਨਾ ਚਾਹੁੰਦਾ ਸੀ। ਉਤਸੁਕਤਾ ਨੇ ਮੈਨੂੰ ਅੱਗੇ ਵਧਣ ਲਈ ਮਜਬੂਰ ਕੀਤਾ।

ਮੈਂ ਦੁਬਾਰਾ ਉਸ ਸਮੱਸਿਆ 'ਤੇ ਕੰਮ ਕਰਨਾ ਸ਼ੁਰੂ ਕੀਤਾ। ਮੈਨੂੰ ਹੱਲ ਮਿਲ ਗਿਆ। ਇਸਨੂੰ ਸਰਕਟ ਬ੍ਰੇਕਰ (circuit breaker) ਕਿਹਾ ਜਾਂਦਾ ਹੈ।

ਸਾਫਟਵੇਅਰ ਵਿੱਚ, ਇੱਕ ਸਰਕਟ ਬ੍ਰੇਕਰ ਇੱਕ ਸਿੰਗਲ ਫੇਲ੍ਹਅਰ (failure) ਨੂੰ ਤੁਹਾਡੇ ਪੂਰੇ ਸਿਸਟਮ ਨੂੰ ਕ੍ਰੈਸ਼ ਹੋਣ ਤੋਂ ਰੋਕਦਾ ਹੈ। ਇਹ ਤੁਹਾਡੇ ਘਰ ਦੇ ਬ੍ਰੇਕਰ ਵਾਂਗ ਕੰਮ ਕਰਦਾ ਹੈ।

ਇੱਕ ਸਰਕਟ ਬ੍ਰੇਕਰ ਦੀਆਂ ਤਿੰਨ ਸਥਿਤੀਆਂ (states) ਹੁੰਦੀਆਂ ਹਨ:

  • CLOSED: ਸਭ ਕੁਝ ਸਹੀ ਚੱਲ ਰਿਹਾ ਹੈ। ਸਾਰੀਆਂ ਰਿਕਵੈਸਟਾਂ (requests) ਪੂਰੀਆਂ ਹੁੰਦੀਆਂ ਹਨ। ਸਿਸਟਮ ਫੇਲ੍ਹਅਰਾਂ ਨੂੰ ਟ੍ਰੈਕ ਕਰਦਾ ਹੈ। ਜੇਕਰ ਫੇਲ੍ਹਅਰ ਇੱਕ ਸੀਮਾ ਤੱਕ ਪਹੁੰਚ ਜਾਂਦੇ ਹਨ, ਤਾਂ ਸਰਕਟ ਖੁੱਲ੍ਹ (open) ਜਾਂਦਾ ਹੈ।
  • OPEN: ਸਿਸਟਮ ਤੁਰੰਤ ਸਾਰੀਆਂ ਰਿਕਵੈਸਟਾਂ ਨੂੰ ਰੋਕ ਦਿੰਦਾ ਹੈ। ਇਹ ਫੇਲ੍ਹ ਹੋ ਰਹੀ ਸਰਵਿਸ ਨੂੰ ਸੁਧਰਨ ਲਈ ਸਮਾਂ ਦਿੰਦਾ ਹੈ।
  • HALF_OPEN: ਸਿਸਟਮ ਕੁਝ ਟੈਸਟ ਰਿਕਵੈਸਟਾਂ ਦੀ ਇਜਾਜ਼ਤ ਦਿੰਦਾ ਹੈ। ਜੇਕਰ ਉਹ ਸਫਲ ਹੁੰਦੀਆਂ ਹਨ, ਤਾਂ ਸਰਕਟ ਬੰਦ (close) ਹੋ ਜਾਂਦਾ ਹੈ। ਜੇਕਰ ਉਹ ਫੇਲ੍ਹ ਹੋ ਜਾਂਦੀਆਂ ਹਨ, ਤਾਂ ਸਰਕਟ ਦੁਬਾਰਾ ਖੁੱਲ੍ਹ (open) ਜਾਂਦਾ ਹੈ।

ਇੱਥੇ ਕੋਡ ਵਿੱਚ ਇੱਕ ਸਧਾਰਨ ਇੰਪਲੀਮੈਂਟੇਸ਼ਨ (implementation) ਦਿੱਤੀ ਗਈ ਹੈ:

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

ਇਸ ਵਿਧੀ (mechanism) ਨੇ ਮੇਰੀ ਹਾਲੀਆ ਸਮੱਸਿਆ ਨੂੰ ਹੱਲ ਕਰ ਦਿੱਤਾ। ਇਹ ਗਲਤੀਆਂ (errors) ਦੇ ਹੜ੍ਹ ਨੂੰ ਤੁਹਾਡੀ ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ ਖਤਮ ਕਰਨ ਤੋਂ ਰੋਕਦਾ ਹੈ।

ਕਿਰਪਾ ਕਰਕੇ ਕੁਮੈਂਟਸ ਵਿੱਚ ਆਪਣੇ ਵਿਚਾਰ ਸਾਂਝੇ ਕਰੋ। ਮੈਂ ਅਜੇ ਵੀ ਸਿੱਖ ਰਿਹਾ ਹਾਂ।

ਸਰੋਤ: https://dev.to/neel-vekariya/circuit-breaker-explained-through-real-failure-experience-3aeg