Retries can amplify outages if uncontrolled
coreintermediateA retry is meant to paper over a brief, one-off failure — but when a downstream service is already struggling under load, every client retrying its failed request adds MORE load onto the exact service that is failing, at the exact moment it can least handle it. Uncontrolled retries — no cap on attempts, no backoff, every client retrying instantly and in lockstep — can turn a small, recoverable blip into a sustained, self-sustaining outage, because the retry traffic itself becomes the dominant source of load.
Think of it as
Picture a crowded doorway during a fire drill: a few people are stuck because the door briefly jams. If everyone immediately shoves the door again the instant it doesn't open, the crowd pressing on the door only grows — new people arrive at the back of the line while the ones in front keep retrying, and the door has even less chance of easing open than if people paused and thinned out. An uncontrolled retry storm is that same crowd, except the "door" is a struggling downstream service, and each shove is a fresh request adding to the load that's already causing the jam.
What we're doing: Show how a single downstream blip fans out into a much larger retry storm across a call chain.
- 10
- Service A retrying its call to B multiplies B's already-retried calls to the database — 3 retries at A on top of 3 retries at B compounds to up to 9x.
- 12
- The frontend layer compounds the same way again, reaching up to 27x the original request volume from what was a single brief database slowdown.
Why this works: Retry amplification is rarely visible at a single layer in isolation — it is the multiplicative compounding across an entire call chain that turns a two-second blip into a sustained overload, which is why retry budgets need to be reasoned about system-wide, not layer by layer.
Adding retries at every layer of a call chain independently
Wrong
Better
What you see: A brief, minor downstream slowdown is followed by a much longer, much larger spike in request volume against that same downstream service — the load spike outlives and outsizes the original incident.
Why: Retrying independently at every layer of a call chain multiplies attempt counts layer over layer; the fix is to concentrate retry logic at one layer (typically the outermost caller, or a dedicated client library with a shared retry budget) rather than letting every layer add its own retries on top of the layers below it.
- Frontend — retries ×3
- leads to Service A (up to 3x)
- Service A — retries ×3 → up to 9x
- leads to Service B (up to 9x)
- Service B — retries ×3 → up to 27x
- on error, leads to Database (up to 27x)
- Database — 2s blip, now overloaded
Retry policy choices and their effect on downstream load
Remember: Retries fix brief, one-off failures — but uncontrolled retries (no cap, no backoff, every layer retrying independently) add load onto a service at exactly the moment it is least able to handle more, turning a small blip into a sustained, self-inflicted outage.
See also: backoff and jitter · max attempts and dead lettering

