Retry storm: vì sao exponential backoff vẫn chưa đủ, phải thêm jitter
Tóm tắt
Khi một sự cố làm nhiều request thất bại cùng lúc, các client sẽ retry cùng lúc — kể cả khi dùng exponential backoff, vì đồng hồ của chúng vẫn đồng bộ. Thêm jitter (chờ một khoảng ngẫu nhiên) làm các lần retry rải đều ra, server không bị dồn tải.
Kịch bản trong video
| Backoff không jitter | Backoff + full jitter | |
|---|---|---|
| Cách chờ | 0.8s, 1.6s… giống hệt nhau cho mọi client | Ngẫu nhiên trong khoảng [0, base·2ⁿ] |
| Hình dạng tải | Cả 12 request đập vào cùng lúc như “bức tường” | Request rải thành dòng |
| Bị từ chối (503) | 6 lần | 0 lần |
| Thời gian hoàn tất | 4.6 giây | 1.9 giây |
Cùng số lần retry — chỉ khác thời điểm bắn lại.
Áp dụng thế nào?
- Luôn kết hợp: exponential backoff + jitter + giới hạn số lần retry + timeout tổng.
- Chỉ retry lỗi tạm thời (503, timeout, mất kết nối); không retry lỗi 4xx do request sai.
- Đảm bảo idempotency cho thao tác được retry (dùng idempotency key với API thanh toán, tạo đơn…).
- Kết hợp circuit breaker để ngừng retry hẳn khi service đích đang chết.