Trang chủ Kiến Thức Công Nghệ Circuit breaker là gì? Hướng dẫn triển khai Circuit breaker trong thực tế
Công Nghệ

Circuit breaker là gì? Hướng dẫn triển khai Circuit breaker trong thực tế

Chia sẻ
Circuit breaker là gì? Hướng dẫn triển khai Circuit breaker trong thực tế
Chia sẻ

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:

  1. 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.
  1. 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.
  1. 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

Java

@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

Bash

# 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.

Bài viết cùng chuyên mục
Tối ưu ứng dụng với cấu trúc dữ liệu cơ bản và bitwise
Công Nghệ

Tối ưu ứng dụng với cấu trúc dữ liệu cơ bản và bitwise

Trong bài viết này, 200Lab sẽ chia sẻ những trường hợp dễ...

Công Nghệ

So sánh Flutter vs React Native: Framework nào đáng học năm 2021

Điểm chung của Flutter, React Native đều là Cross-platform Mobile, build native...

HTTP/2 là gì? So sánh HTTP/2 và HTTP/1
Công Nghệ

HTTP/2 là gì? So sánh HTTP/2 và HTTP/1

Từ khi Internet ra đời, sự phát triển về các giao thức...

Upload File từ Frontend đến Backend mà rất nhiều bạn vẫn đang làm sai!!
Công Nghệ

Upload File từ Frontend đến Backend mà rất nhiều bạn vẫn đang làm sai!!

1. Client encode file (base64) rồi gởi về backend 200Lab đã từng...

Công Nghệ

React Native – Hướng dẫn làm việc với Polyline và Animated-Polyline trên Map

Vẽ đường đi trên bản đồ là một nghiệp vụ vô cùng...

Công Nghệ

Hybrid App và Native App: Những khác biệt to lớn

Bất cứ khi nào một công ty quyết định làm ứng dụng...

Web/System Architecture 101 – Kiến trúc web/hệ thống cơ bản cho người mới
Công Nghệ

Web/System Architecture 101 – Kiến trúc web/hệ thống cơ bản cho người mới

Đây là một kiến trúc cơ bản mà bất kì một người...

Công Nghệ

Tư duy kiến trúc thông qua các trò chơi mà rất nhiều bạn không biết

Tư duy kiến trúc là gì? Tư duy kiến trúc có thể...