Circuit breaker là gì? Hướng dẫn triển khai Circuit breaker trong thực tế
04 Mar, 2025
Hướng nội
AuthorCircuit Breaker là một design pattern được tạo ra để ngăn chặn lỗi lan rộng trong các hệ thống phân tán đặc biệt là trong kiến trúc microservices

Mục Lục
Trong kiến trúc microservices, các service thường xuyên gọi lẫn nhau để xử lý dữ liệu. Nhưng điều gì sẽ xảy ra nếu một service gặp sự cố? Ví dụ:
- Service A gọi đến Service B, và Service B lại phụ thuộc vào Service C.
- Nếu Service C gặp vấn đề (timeout, lỗi, hoặc quá tải):
- Service B sẽ phải chờ đợi phản hồi từ Service C (hoặc bị timeout).
- Điều này làm Service B bị chiếm dụng tài nguyên (threads, connections).
- Kết quả là Service A cũng phải chờ đợi, và toàn bộ hệ thống dần bị "tắc nghẽn".
Đây chính là hiệu ứng domino (cascade failure) mà Circuit Breaker được thiết kế để ngăn chặn. Bây giờ hãy cùng mình tìm hiểu về Circuit Breaker trong bài viết sau đây nhé.
1. Circuit breaker là gì?
Circuit Breaker là một mẫu thiết kế (design pattern) được Michael Nygard giới thiệu trong cuốn sách "Release It!". Nó được tạo ra để ngăn chặn lỗi lan rộng trong các hệ thống phân tán, đặc biệt là trong kiến trúc microservices.
Hãy tưởng tượng Circuit Breaker (CB) giống như một cầu dao điện trong nhà bạn: khi phát hiện dòng điện quá tải, cầu dao sẽ ngắt mạch để bảo vệ toàn bộ hệ thống khỏi bị hư hại.
Trong phần mềm, Circuit Breaker cũng hoạt động tương tự:
- Khi một service gặp sự cố (quá tải hoặc không phản hồi), CB sẽ ngắt các request đến service đó để tránh tạo thêm áp lực.
- Điều này giúp cho service có thời gian phục hồi, đồng thời ngăn không cho lỗi lây lan sang các phần khác trong hệ thống.
- Kết quả: Tăng tính ổn định hệ thống và ngăn chặn hiệu ứng domino trong microservices.
Hiểu và áp dụng Circuit Breaker sẽ giúp hệ thống microservices của bạn ổn định hơn, giảm thiểu rủi ro khi các service phụ thuộc gặp vấn đề.

2. Cách hoạt động của Circuit Breaker
Circuit Breaker có 3 trạng thái chính:
- Closed (Trạng thái bình thường):
- Tất cả các request đều được gửi đến service đích như bình thường.
- Circuit Breaker theo dõi số lượng lỗi xảy ra.
- Nếu số lỗi vượt quá một ngưỡng cho phép → chuyển sang trạng thái Open.
- Open (Ngắt mạch):
- Tất cả các request đến service đích sẽ bị chặn lại.
- Thay vì chờ đợi, Circuit Breaker sẽ fail fast (ngắt ngay) hoặc trả về một fallback response.
- Sau một khoảng thời gian timeout → chuyển sang trạng thái Half-Open để thử nghiệm.
- Half-Open (Thử nghiệm):
- Cho phép một số lượng nhỏ request thử nghiệm được gửi đến service đích.
- Nếu các request này thành công → quay lại trạng thái Closed (bình thường).
- Nếu tiếp tục thất bại → chuyển lại trạng thái Open.

3. Hướng dẫn triển khai Circuit breaker
API Gateway là nơi phổ biến nhất để triển khai Circuit Breaker vì các lý do sau:
- Tập trung quản lý: Cấu hình và quản lý tại một điểm duy nhất
- Bảo vệ client: Ngăn chặn requests đến services gặp sự cố ngay từ entry point
- Giảm tải cho hệ thống: Chặn requests từ sớm, tránh tạo áp lực cho các services khác
3.1 Spring Cloud Gateway
@Bean
public RouteLocator routes(RouteLocatorBuilder builder) {
return builder.routes()
.route("payment_service", r -> r.path("/api/payments/**")
.filters(f -> f.circuitBreaker(config -> config
.setName("paymentCircuitBreaker")
.setFallbackUri("forward:/fallback/payment")))
.uri("lb://payment-service"))
.route("inventory_service", r -> r.path("/api/inventory/**")
.filters(f -> f.circuitBreaker(config -> config
.setName("inventoryCircuitBreaker")
.setFallbackUri("forward:/fallback/inventory")))
.uri("lb://inventory-service"))
.build();
}
// Controller xử lý fallback
@RestController
class FallbackController {
@GetMapping("/fallback/payment")
public ResponseEntity<?> paymentFallback() {
Map<String, String> response = Map.of(
"status", "Service Unavailable",
"message", "Payment service is currently unavailable"
);
return ResponseEntity.status(HttpStatus.SERVICE_UNAVAILABLE).body(response);
}
}
3.2 Kong Gateway
# Cài đặt plugin Circuit Breaker cho service payment
curl -X POST http://kong:8001/services/payment-service/plugins \
--data "name=circuit-breaker" \
--data "config.threshold=50" \
--data "config.window_size=60" \
--data "config.volume_threshold=10"
4. Kết luận
Circuit Breaker hoạt động như một cầu dao thông minh, đảm bảo hệ thống của bạn không bị quá tải hoặc lan truyền lỗi, đồng thời tự động khôi phục khi service trở lại bình thường.