Circuit Breaker not only for HTTP calls! (based on resilience4j)
Bài tóm tắt Allegro 2024 3. Quy mô lớn Độ khó: Cơ bản
Allegro · 2024 · 3. Quy mô lớn · Độ khó: Cơ bản — bài gốc
Bối cảnh
- Luồng thanh toán của Allegro có hàng chục service và nhiều bên thứ ba; mỗi phương thức thanh toán qua một đối tác khác, và nhiều lỗi của đối tác không sửa được từ phía Allegro.
- Hai lựa chọn: trả lỗi cho người dùng lúc thanh toán và chờ sửa, hoặc tắt phương thức đó một cách êm. Họ chọn cách thứ hai.
- Ban đầu tắt bằng cách tắt service của phương thức, rồi chuyển sang tắt bằng cấu hình. Cả hai đều chậm: nhiều người đã bấm "thanh toán" và gặp lỗi trước khi phương thức bị tắt.
Thay đổi chính
- Dùng circuit breaker của Resilience4j cho một quyết định nghiệp vụ, không cho lời gọi HTTP:
- các service thanh toán gửi event thành công/thất bại theo từng phương thức qua message broker;
- một microservice giữ một circuit breaker cho mỗi phương thức, nhận event và cập nhật trạng thái;
- đổi trạng thái thì ghi vào repository trạng thái; service "availability" đọc nó để ẩn phương thức trên frontend.
- Vài chỗ "lách": Resilience4j cần thời gian thực thi (vì có thể coi task chậm là lỗi) nên truyền mặc định 1 giây; việc xin phép (
tryAcquirePermission) lẽ ra nằm ở service lọc phương thức nhưng event lại gom ở service khác. - HALF_OPEN: vẫn phải cho một phần traffic thử để biết phương thức đã hồi chưa; tỉ lệ người dùng được thử tính theo độ phổ biến của phương thức.
- Khoảng 70 dòng code; theo Allegro, thời gian phản ứng với lỗi của đối tác giảm rõ và người dùng được chuyển sang phương thức đang chạy.
Bài học cho SWE
- Circuit breaker là một cơ chế giảm chất lượng có chủ đích ở mức nghiệp vụ: tắt một lựa chọn hỏng thay vì để người dùng gặp lỗi (Load shedding, rate limit và backpressure).
- Quyết định tắt/bật dựa trên tín hiệu thật (tỉ lệ lỗi theo phương thức), không chờ người sửa cấu hình (Tự động hoá vận hành và auto-remediation).
- Lúc thử mở lại, lượng traffic thử nên tỉ lệ với lượng traffic bình thường của lựa chọn đó.
Liên quan
Được nhắc tới trong
Công ty (1)
Bài tóm tắt (3)