Backend nền tảng
B5 · Timeout, Retry, Backoff và Circuit Breaker
Timeout: mọi lời gọi qua mạng (DB, HTTP, queue) phải có giới hạn thời gian.
B5 · Middle · cốt lõi
Gọi điện mà không giới hạn thời gian chờ thì bạn cầm máy mãi. Gọi lại liên tục khi tổng đài quá tải chỉ làm nó nghẽn thêm. Cầu dao tự ngắt khi quá tải để cả nhà không cháy.
Cốt lõi
- Timeout: mọi lời gọi qua mạng (DB, HTTP, queue) phải có giới hạn thời gian.
- Retry chỉ cho lỗi tạm thời và thao tác idempotent; dùng exponential backoff + jitter (chờ 1s, 2s, 4s… cộng thêm ngẫu nhiên).
- Circuit breaker: lỗi vượt ngưỡng thì ngắt, trả lỗi ngay, sau một lúc mới thử lại.
- Fallback: dùng dữ liệu cache hoặc giá trị mặc định khi dịch vụ phụ lỗi.
Đánh đổi
Retry không kiểm soát gây "retry storm" đánh sập dịch vụ vừa hồi phục; retry thao tác không idempotent gây trùng lặp.
Trong thực tế
Dịch vụ gợi ý sản phẩm lỗi → trang chủ vẫn hiện, chỉ ẩn khối gợi ý (graceful degradation).
Bug thường gặp
Không đặt timeout cho HTTP client (nhiều thư viện mặc định chờ vô hạn) → dịch vụ phụ treo kéo theo dịch vụ chính treo.
Tự hỏi lại
Timeout ở các tầng (client, gateway, service, DB) nên sắp xếp thế nào?