system-design

Circuit Breaker Pattern: Ngăn chặn cascading catastrophic failures

Trong Distributed Systems, failure là điều tất yếu. Circuit Breaker giúp hệ thống 'fail fast' và tự phục hồi thay vì sập toàn bộ dây chuyền.

newspaper

Phạm Hoàng Long

6 tháng 1, 2026 schedule 3 phút đọc
Circuit Breaker Pattern: Ngăn chặn cascading catastrophic failures
Featured Image

Sáng thứ 2, Service Payment (của bên thứ 3) bị chậm. Thay vì trả về trong 200ms, nó mất 30s để timeout. Hệ quả:

  1. Thread của Order Service bị block chờ Payment.
  2. Thread pool của Order Service cạn kiệt.
  3. Order Service bị treo.
  4. Gateway gọi Order Service cũng bị timeout.
  5. Toàn bộ hệ thống sập.

Đây gọi là Cascading Failure. Một con domino đổ làm sập cả bàn cờ. Giải pháp: Circuit Breaker (Cầu dao tự động).

Cơ chế hoạt động

Circuit Breaker hoạt động như một proxy trung gian, giám sát tỷ lệ lỗi (failure rate).

1. Trạng thái CLOSED (Bình thường)

  • Cầu dao đóng, dòng điện (request) chạy qua bình thường.
  • Nếu request thành công -> Reset đếm lỗi.
  • Nếu request thất bại -> Tăng đếm lỗi.

2. Trạng thái OPEN (Ngắt)

  • Nếu tỷ lệ lỗi vượt ngưỡng (vd: 50% trong 10s), cầu dao nhảy sang OPEN.
  • Fail Fast: Mọi request đến lúc này bị chặn ngay lập tức, trả về lỗi hoặc fallback data, KHÔNG gọi service đích.
  • Mục đích: Giảm tải cho service đích để nó phục hồi.

3. Trạng thái HALF-OPEN (Dò đường)

  • Sau một khoảng thời gian (vd: 30s), cầu dao chuyển sang HALF-OPEN.
  • Cho phép một số lượng nhỏ request (“chuột bạch”) đi qua.
  • Nếu thành công -> Chuyển về CLOSED (Hệ thống đã phục hồi).
  • Nếu thất bại -> Quay lại OPEN (Vẫn chưa ổn).

Implementation

Rất nhiều thư viện hỗ trợ pattern này:

  • Java: Resilience4j (trước đây là Hystrix).
  • Node.js: Opossum.
  • PHP: Ackintosh/Ganesha.

Ví dụ pseudo-code:

const breaker = new CircuitBreaker(async function callPaymentApi() {
    return await http.post('/payment');
}, {
    timeout: 3000, // Nếu quá 3s coi như lỗi
    errorThresholdPercentage: 50, // Lỗi 50% thì ngắt
    resetTimeout: 30000 // Chờ 30s trước khi thử lại
});

breaker.fallback(() => {
    return { status: 'pending', message: 'Payment chậm, vui lòng thử lại sau.' };
});

// Sử dụng
const result = await breaker.fire();

Khi nào cần dùng?

Bạn nên wrap MỌI external call (database, 3rd party API, microservice khác) bằng Circuit Breaker.

Đặc biệt quan trọng trong Microservices. Đừng để một service nhỏ (như Email Service) làm sập cả trang Checkout của bạn.

Kết luận

Circuit Breaker không sửa lỗi giúp bạn. Nó giúp hệ thống của bạn:

  1. Resilient: Vẫn hoạt động (partial availability) khi một phần bị chết.
  2. Responsive: Trả về lỗi ngay lập tức thay vì bắt user chờ 30s timeout.

Hãy cài đặt Aptomat cho code của bạn ngay hôm nay.

quizQuick Quiz
Câu 1/3

Circuit Breaker Pattern được lấy cảm hứng từ thiết bị nào trong đời thực?

history_edu Góc học tập & giải trí

Thử Thách Kiến Thức Lịch Sử?

Khám phá hàng trăm câu hỏi trắc nghiệm lịch sử thú vị tại HistoQuiz. Vừa học vừa chơi, nâng cao kiến thức ngay hôm nay!

Chơi Ngay arrow_forward