Giải thích về Circuit Breaker thông qua một sự cố thực tế
Tôi đã gặp phải một vấn đề bất ngờ cách đây vài ngày.
Sự thất vọng ập đến khiến tôi rất nản lòng. Tôi muốn khắc phục nó. Sự tò mò đã thôi thúc tôi tiếp tục tìm hiểu.
Tôi ngồi lại với vấn đề một lần nữa. Và tôi đã tìm ra giải pháp. Nó được gọi là circuit breaker.
Trong phần mềm, circuit breaker ngăn chặn một lỗi đơn lẻ làm sập toàn bộ hệ thống của bạn. Nó hoạt động giống như cầu dao điện trong nhà bạn.
Một circuit breaker có ba trạng thái:
- CLOSED: Mọi thứ hoạt động bình thường. Tất cả các yêu cầu đều được thực hiện. Hệ thống theo dõi các lỗi. Nếu số lượng lỗi chạm đến giới hạn, mạch sẽ mở.
- OPEN: Hệ thống dừng ngay lập tức tất cả các yêu cầu. Điều này giúp dịch vụ đang gặp lỗi có thời gian để phục hồi.
- HALF_OPEN: Hệ thống cho phép một vài yêu cầu thử nghiệm. Nếu chúng thành công, mạch sẽ đóng lại. Nếu chúng thất bại, mạch sẽ mở ra lần nữa.
Dưới đây là một bản triển khai đơn giản bằng mã nguồn:
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
}
}
}
Cơ chế này đã giải quyết được vấn đề gần đây của tôi. Nó ngăn chặn sự tràn ngập của các lỗi làm chết ứng dụng của bạn.
Hãy chia sẻ suy nghĩ của bạn dưới phần bình luận nhé. Tôi vẫn đang trong quá trình học hỏi.
Nguồn: https://dev.to/neel-vekariya/circuit-breaker-explained-through-real-failure-experience-3aeg