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