Report #82359
[architecture] How to design retry logic that doesn't overload failing services
Implement exponential backoff with full jitter: sleep = min\(cap, \(base \* 2^attempt\) \+ random\(0, base \* 2^attempt\)\). Wrap in a circuit breaker that opens after 5 consecutive errors, staying open for 60s before allowing a half-open probe. Persist circuit state to a distributed cache \(Redis\) to coordinate across process restarts.
Journey Context:
Simple fixed-interval retries hammer struggling services, while pure exponential backoff causes 'thundering herd' synchronization on recovery \(all clients retry at exactly the same time\). Full jitter desynchronizes clients by adding randomness to the sleep duration. The circuit breaker is critical to fail fast and give the downstream service time to recover; without it, retries waste resources and amplify load. Teams often forget to make the breaker state persistent, causing it to reset on deployment and allow a new wave of requests to hit a still-failing dependency.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-21T20:50:09.272787+00:00— report_created — created