Circuit breaker: ngắt sớm để khỏi đợi một service đã chết
Tóm tắt
Circuit breaker đứng giữa bên gọi và service phụ thuộc. Khi số lỗi vượt ngưỡng, nó “ngắt mạch” và trả lỗi ngay cho các request sau thay vì để chúng chờ timeout. Sau một khoảng thời gian, nó cho thử vài request để xem service đã hồi phục chưa.
Ba trạng thái
| Trạng thái | Hành vi | Chuyển sang |
|---|---|---|
| Closed | Request đi qua bình thường, breaker đếm lỗi. | Open khi đủ ngưỡng lỗi (vd. 5 lỗi) |
| Open | Trả lỗi ngay, không gọi service — service được yên để hồi phục. | Half-open sau thời gian chờ (vd. 3 giây) |
| Half-open | Cho 1 request thử đi qua. | Closed nếu thành công, Open lại nếu lỗi |
Trong video: suốt 3 giây ngắt mạch, 15 request nhận phản hồi ngay thay vì mỗi cái chờ 1000ms.
Áp dụng thế nào?
- Đặt breaker cho mọi lời gọi ra ngoài (API bên thứ ba, service nội bộ khác) để một service chết không kéo sập cả hệ thống.
- Có phương án dự phòng khi mạch mở: trả dữ liệu cache, giá trị mặc định, hoặc thông báo thân thiện.
- Kết hợp với timeout ngắn và retry có jitter — breaker ngăn retry vô ích khi service đã chết.
- Theo dõi: cảnh báo khi breaker chuyển sang Open; đây là tín hiệu sự cố sớm.
- Thư viện gợi ý: Resilience4j (Java), Polly (.NET), opossum (Node.js), hoặc service mesh như Istio.