പരാജയത്തിലൂടെ സർക്യൂട്ട് ബ്രേക്കർ വിവരിക്കുന്നു

കുറച്ചു ദിവസങ്ങൾക്ക് മുമ്പ് ഞാൻ അപ്രതീക്ഷിതമായ ഒരു പ്രശ്നം നേരിട്ടു.

വലിയ നിരാശ എനിക്ക് അനുഭവപ്പെട്ടു. അത് പരിഹരിക്കണമെന്ന് ഞാൻ ആഗ്രഹിച്ചു. അറിയാനുള്ള ആകാംക്ഷ എന്നെ അത് തുടരാൻ പ്രേരിപ്പിച്ചു.

ഞാൻ വീണ്ടും ആ പ്രശ്നത്തിൽ ശ്രദ്ധ കേന്ദ്രീകരിച്ചു. ഒടുവിൽ എനിക്ക് പരിഹാരം ലഭിച്ചു. അതിനെയാണ് സർക്യൂട്ട് ബ്രേക്കർ (circuit breaker) എന്ന് വിളിക്കുന്നത്.

സോഫ്റ്റ്‌വെയറിൽ, ഒരു ചെറിയ പരാജയം കാരണം നിങ്ങളുടെ മുഴുവൻ സിസ്റ്റവും തകരാറിലാകാതിരിക്കാൻ സർക്യൂട്ട് ബ്രേക്കർ സഹായിക്കുന്നു. ഇത് നിങ്ങളുടെ വീട്ടിലെ സർക്യൂട്ട് ബ്രേക്കർ പ്രവർത്തിക്കുന്നതുപോലെയാണ്.

സർക്യൂട്ട് ബ്രേക്കറിന് മൂന്ന് അവസ്ഥകളുണ്ട്:

  • CLOSED: എല്ലാം കൃത്യമായി പ്രവർത്തിക്കുന്നു. എല്ലാ റിക്വസ്റ്റുകളും കടന്നുപോകുന്നു. സിസ്റ്റം പരാജയങ്ങൾ ട്രാക്ക് ചെയ്യുന്നു. പരാജയങ്ങൾ ഒരു പരിധിയിൽ എത്തിയാൽ സർക്യൂട്ട് ഓപ്പൺ ആകുന്നു.
  • OPEN: സിസ്റ്റം എല്ലാ റിക്വസ്റ്റുകളും ഉടൻ തന്നെ നിർത്തുന്നു. ഇത് പരാജയപ്പെട്ട സർവീസിന് വീണ്ടെടുക്കാൻ സമയം നൽകുന്നു.
  • HALF_OPEN: സിസ്റ്റം കുറച്ച് ടെസ്റ്റ് റിക്വസ്റ്റുകൾ അനുവദിക്കുന്നു. അവ വിജയിച്ചാൽ സർക്യൂട്ട് ക്ലോസ് ആകുന്നു. അവ പരാജയപ്പെട്ടാൽ സർക്യൂട്ട് വീണ്ടും ഓപ്പൺ ആകുന്നു.

ഇതിന്റെ ലളിതമായ ഒരു കോഡ് താഴെ നൽകുന്നു:

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

ഈ സംവിധാനം എന്റെ അടുത്തകാലത്തെ പ്രശ്നം പരിഹരിച്ചു. പിശകുകളുടെ (errors) പ്രവാഹം നിങ്ങളുടെ ആപ്ലിക്കേഷനെ തകരാറിലാക്കുന്നത് ഇത് തടയുന്നു.

നിങ്ങളുടെ അഭിപ്രായങ്ങൾ കമന്റുകളിൽ പങ്കുവെക്കുക. ഞാൻ ഇപ്പോഴും പഠിച്ചുകൊണ്ടിരിക്കുകയാണ്.

സ്രോതസ്സ്: https://dev.to/neel-vekariya/circuit-breaker-explained-through-real-failure-experience-3aeg