p50 ổn, p99 xấu vì vài replica/node chậm. User không care “median” — họ dính tail.
Hedging (speculative retry): gửi request 1; nếu sau threshold X ms chưa về, gửi request 2 (thường replica khác); lấy response đầu; cancel nhánh thua. Mua latency bằng thêm load.
Hedge ≠ retry
Retry — sau khi đã fail (5xx, timeout hard)
Hedge — trước fail, vì chậm (vẫn có thể thành công muộn)
Cả hai: amplification (xem retry-what-when)
Hedge nguy hiểm hơn nếu side-effect: hai request có thể cùng commit
Timeline ý
t=0 gửi A ──────────────────────────►
t=X vẫn chưa về → gửi B ──────► B về trước
cancel A
t<X A về → không gửi B (hedge tiết kiệm)
Chọn X quanh p95–p99 dependency: quá thấp → hedge gần như mọi request (gần ×2 QPS); quá cao → ít khi kích hoạt, p99 không giảm.
Điều kiện bắt buộc
- Idempotent / an toàn dual — GET, cache fill; không hedge “charge thẻ” trừ khi có cùng key.
- Cancel nhánh thua — không cancel = 2× inventory + 2× work (đôi khi 2× effect).
- Còn budget — timeout budget; đừng hedge khi còn 50ms.
- Dependency khỏe — breaker đỏ / quá tải thì hedge = dầu vào lửa ( breaker, shed).
Chi phí
- QPS dependency tăng (partial hedge rate × 2).
- In-flight tạm thời ×2 trên path đó.
- Phức tạp client: race, cancel, metric hedge_hit.
Đo: p99 trước/sau, hedge_fire_rate, dependency CPU. Không hedge “vì hay”.
Khi không hedge
- Write money / SMS / non-idempotent.
- Single replica / không có “chậm lệch” — hedge chỉ nhân load.
- Đã gần saturation — cần scale/shed, không speculative.
Một câu
Hedge mua tail latency bằng capacity — chỉ khi effect an toàn, nhánh thua bị hủy, và dependency còn headroom.