Retries without jitter cause the outage they're meant to prevent
A fleet of clients retrying on the same fixed backoff hits the recovering service in synchronized waves. Add jitter or the retry logic becomes the incident.
When a downstream dependency returns an HTTP 503 or drops a connection, the standard engineering response is to implement exponential backoff. The client waits one second, then two, then four, before attempting the request again. This pattern is designed to give the struggling service time to recover. For a single isolated client, the logic is flawless. At enterprise scale, it is a catastrophic architectural flaw.
The Synchronized Wave Consider a scenario where a critical internal service experiences a brief network partition. A thousand concurrent microservice instances all drop their connections at the exact same millisecond. They all log an error and immediately execute the exact same deterministic exponential backoff algorithm.
One second later, all one thousand instances fire their first retry simultaneously. The downstream service, which was just beginning to stabilize and clear its backlog, is instantly hit by a massive, synchronized wall of traffic. Its connection pool exhausts immediately, and it crashes again. Two seconds later, the second synchronized wave hits. Four seconds later, the third wave hits.
The Self-Inflicted Outage By implementing a strict retry schedule, the engineering team has accidentally built an automated distributed denial of service weapon. The retry mechanism itself becomes the primary reason the outage persists.
If you look at the telemetry during this type of incident, the traffic does not look like a normal operational curve. It looks like a heartbeat monitor. You see massive spikes of incoming requests followed by periods of complete silence, repeating until the maximum retry limit is reached across the fleet. The recovering service never gets a chance to process requests efficiently because the load is never distributed evenly.
Breaking the Lockstep The solution to this problem is mathematically trivial but structurally mandatory. You must introduce jitter into the retry calculation.
Jitter is simply a randomized variance applied to the wait time. Instead of waiting exactly four seconds for the third attempt, the client calculates a random sleep interval between two and six seconds. This tiny injection of randomness completely destroys the synchronization. The thousand failing clients are now scattered randomly across a continuous time window.
When the downstream service comes back online, it receives a smooth, manageable stream of requests instead of a destructive spike. In a distributed system, predictability is often a vulnerability. Resiliency relies on preventing your infrastructure from ever acting in perfect lockstep.