Retry только safe + retryable (5xx, timeout, 429); exponential backoff + full jitter; honour Retry-After; cap delay и attempts. Server-side — token bucket / sliding window → 429.
Разбор
Retry only what's safe. 500/502/503/504, timeout, 429 — retry. 400/401/403/404/422 — fail identically forever. Auto-retry только idempotent (GET/PUT/DELETE) или с idempotency key для POST.
Exponential backoff: delay = base * 2^attempt. base 200ms → 200, 400, 800, 1600ms. Cap delay и count (3–5).
Jitter обязателен. Без jitter все clients retry together — synchronized spikes. Full jitter — sleep = random(0, min(cap, base * 2^attempt)) — flatten load best.
Respect server. 429/503 часто несут Retry-After. Honour over own backoff. RateLimit-Limit / Remaining / Reset — pace before throttle.
Rate limiting server-side: token bucket (steady refill, bursts до bucket size) или sliding window. Empty → 429.
Итог
Polite retries = exponential + full jitter + Retry-After; naive immediate retry = self-inflicted outage.