Backend

99 Ngày Spring — Ngày 76: Circuit Breaker với Resilience4j

SSite Admin
10 tháng 10, 2026 2 phút đọc 5 lượt xem
99 Ngày Spring — Ngày 76: Circuit Breaker với Resilience4j

Một service phụ thuộc bị lỗi liên tục thì retry thêm chỉ làm cả hai bên quá tải. Circuit breaker quan sát kết quả gọi, tạm ngừng gửi yêu cầu khi vượt ngưỡng lỗi và thử lại bằng một số yêu cầu thăm dò. Với Spring Boot 3.x, dùng resilience4j-spring-boot3 và spring-boot-starter-aop cho annotation; thêm Actuator khi cần metric. Breaker vẫn cần timeout và giới hạn tài nguyên đi kèm.

Circuit Breaker với Resilience4j

1. Ba trạng thái và cửa sổ đo

CLOSED cho phép gọi và ghi nhận kết quả. Khi cửa sổ đủ mẫu và tỷ lệ lỗi hoặc gọi chậm vượt ngưỡng, nó chuyển OPEN và từ chối nhanh. Hết thời gian chờ, HALF_OPEN cho một số lời gọi thử; đủ tốt thì đóng lại, vẫn xấu thì mở tiếp. Chọn minimumNumberOfCalls đủ lớn để một lỗi đơn lẻ không làm ngắt mạch.

resilience4j.circuitbreaker.instances.payment.slidingWindowSize=20
resilience4j.circuitbreaker.instances.payment.minimumNumberOfCalls=10
resilience4j.circuitbreaker.instances.payment.failureRateThreshold=50
resilience4j.circuitbreaker.instances.payment.waitDurationInOpenState=10s
resilience4j.circuitbreaker.instances.payment.permittedNumberOfCallsInHalfOpenState=3

2. Fallback giữ đúng ngữ nghĩa

Fallback chỉ phù hợp khi có kết quả thay thế thật: ví dụ trả giá được cache kèm cờ stale. Nếu thanh toán thất bại, đừng giả trả về thành công; hãy báo lỗi có thể xử lý hoặc để đơn ở trạng thái chờ. Tách lỗi nghiệp vụ 4xx khỏi lỗi hạ tầng để không tính mọi từ chối hợp lệ là lỗi hệ thống.

@CircuitBreaker(name = "payment", fallbackMethod = "pending")
PaymentResult charge(Order order) { return client.charge(order); }
PaymentResult pending(Order order, Throwable error) {
    return PaymentResult.pending(order.id());
}

3. Bulkhead và rate limiter khác gì

Bulkhead giới hạn số lời gọi đồng thời tới đối tác, tránh một đối tác chậm chiếm hết luồng hoặc kết nối. Rate limiter giới hạn số lời gọi theo thời gian, phù hợp quota. Circuit breaker phản ứng với sức khỏe đối tác; ba cơ chế giải quyết ba câu hỏi khác nhau. Nếu đối tác đã quá tải, retry có backoff, jitter và giới hạn tổng thời gian.

  • Timeout chặn lời gọi dài; bulkhead chặn số lời gọi cùng lúc.

  • Circuit breaker chặn thêm yêu cầu khi lỗi vượt ngưỡng.

4. Kiểm tra bằng lỗi thật

Dùng stub cho đối tác trả 503, trả chậm và phục hồi. Theo dõi state, failure rate và số lời gọi bị từ chối qua Actuator/Micrometer. Thử xem fallback có làm sai trạng thái đơn hàng không. Ví dụ @CircuitBreaker ở đây thuộc starter resilience4j-spring-boot3; nếu dùng API Spring Cloud CircuitBreaker thay vào đó, chọn release train tương thích Spring Boot 3.x.

// Test sequence: 10 failed calls -> OPEN -> wait -> 3 probes.
// Assert: no payment is marked PAID by a fallback.

Circuit breaker ngăn lỗi lan rộng; timeout, bulkhead và fallback làm hệ thống suy giảm có kiểm soát. Ngày 77 nối request qua các service bằng distributed tracing.

Tài liệu đối chiếu

  • https://resilience4j.readme.io/docs/getting-started-3

  • https://resilience4j.readme.io/docs/circuitbreaker

S

Site Admin

Engineer and writer. Building things with TypeScript and distributed systems.

Bình luận (0)

Bạn cần đăng nhập bằng Google để bình luận.

Hãy là người bình luận đầu tiên.

Bài viết liên quan

99 Ngày Java — Ngày 76: Soft, Weak và Phantom Reference

Bốn mức tham chiếu, WeakHashMap, ReferenceQueue và cách chọn cache có giới hạn trên Java 21.

10 thg 10, 20262 phút6
K

Học System Design qua 21 bài: yêu cầu, capacity, database, cache, hệ phân tán và 6 bài thực hành, kèm bài tập, sơ đồ luồng và mục lục đầy đủ.

10 thg 10, 20266 phút3
S

Học cách đi từ vấn đề đến kiến trúc, phân biệt architecture với design và bảo vệ lựa chọn bằng yêu cầu, số liệu và đánh đổi.

10 thg 10, 20266 phút3