System Design

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 jitterBackoff + full jitter
Cách chờ0.8s, 1.6s… giống hệt nhau cho mọi clientNgẫu nhiên trong khoảng [0, base·2ⁿ]
Hình dạng tảiCả 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ần0 lần
Thời gian hoàn tất4.6 giây1.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.