Pattern · seen in 4 breakdowns across 4 companies

Retry with Backoff and Jitter

Retry with backoff and jitter means when a call fails, each retry waits a bit longer and a bit randomly, so a wave of retries doesn't hit a struggling server all at once.

The mechanism

The pattern at its core: a crowd of clients all retrying a server that just failed, and a choice of how they space out their retries - all together, or spread apart.

LIVE ARTIFACTTHE PATTERN, GENERALOPEN FULL SCREEN ↗
THE IDEAWhen a server fails, every client that was talking to it wants to retry. If they all retry on the same clock, they arrive in synchronized waves that keep knocking the server back down. Spacing each client out by a slightly random amount turns those waves into a smooth load the recovering server can handle.
WHAT TO TRYWatch the retry load with no backoff, then with backoff, then with backoff and jitter. Only the last one turns the spikes into a smooth curve under the capacity line.

Watch synchronized retries re-crash a server - then add jitter and smooth them into a curve it can absorb.

Definition

When a client keeps retrying a call that failed against a shared service, just trying again right away, over and over, is dangerous. The failure might be a brief blip that clears on its own, in which case a quick retry works. Or the server itself might be in trouble, in which case every retry piles on more load at the worst possible time. The client cannot tell which of the two it is facing. Exponential backoff handles both without the client knowing which: after each failure it waits longer than the last (each wait roughly doubling), so a brief blip recovers fast while a real outage sees the retries slow to a trickle.

Backoff by itself is not enough when many clients fail together. One server incident knocks out thousands of clients at almost the same instant, and if they all follow the same backoff schedule they all retry at almost the same instant too. That is the thundering herd: each wave of retries re-creates the very overload that caused the failure. Adding a little randomness to each client's wait (jitter) breaks the clients out of lockstep. Each one waits a slightly different amount, so together their retries spread into a smooth wave the server can absorb while it recovers.

WHY JITTER WORKS
Two load charts: without jitter, tall synchronized retry spikes over capacity; with jitter, a low smooth curve under capacity.
Without jitter, clients that failed together retry together, and the load arrives in tall synchronized spikes that keep overwhelming the server. A little randomness in each wait spreads the same retries into a smooth curve it can absorb.

This is one of the oldest tricks in networking, and it shows up everywhere. Ethernet used it to let many machines share one wire, and TCP uses it to space out resends. The AWS and Stripe client libraries do backoff and jitter by default, often bundled with idempotency keys so a retry is both safe and polite.

The bigger point: a retry is not just the client's own business - it is load that the rest of the system has to absorb. Backoff and jitter are the client's half of protecting against overload; server-side load shedding is the other half, and a system under real pressure usually needs both.

When it applies

01A client keeps retrying a shared service. The retries land on infrastructure that other clients depend on too, so how you retry is everyone's problem, not just yours.
02Many clients can fail at the same moment. A server incident, a network partition healing, or a fleet-wide reconnect can make thousands of clients try to recover in sync and re-trigger the original overload.
03You already shed load on the server side. Backoff and jitter are the client-side half of the same job, and doing one without the other leaves half the overload problem unsolved.
04You ship an SDK or client library. The people who use it will not all add polite retries themselves, so the safe behavior has to be built into the library by default.

Tradeoffs

Each client recovers slower so the group stays stable. A client in backoff can hold stale state for longer and longer windows, and jitter adds more variance on top, which latency-sensitive callers feel directly.
The backoff numbers are load-bearing configuration. The starting wait, the multiplier, the cap, and the attempt limit together decide how fast a healthy system recovers and how hard a sick one gets hit, and bad defaults fail quietly until an incident exposes them.
Jitter makes retry timing non-deterministic. That randomness is the price of spreading the load, and it makes testing, debugging, and reasoning about exact timing harder.
Backoff limits the rate of retries but not the total. A long incident with many queued callers can still add up to overwhelming load, so you also need retry budgets, circuit breakers, or server-side shedding to cap the total.

The same move, 4 ways

Every row is a production system that bet on this pattern — the note says how, in that system's own terms.

Amazon (AWS)
Amazon Builders' Library
2019
This article is the pattern's operational doctrine from its origin company: capped exponential backoff to even out load, jitter to break the correlation that makes backed-off clients return in synchronized waves, and the insight that jitter belongs on all periodic work, not just retries. With Stripe the pattern recurs from the API-provider side; here it is the client fleet's discipline. Read the breakdown →
Airbnb
Airbnb Engineering
2019
The client's half of the contract. Automatic retries have to be spaced out with growing waits and a little randomness (backoff and jitter) so that a wave of retries doesn't all hit at once and overwhelm the service (the 'thundering herd'). And the retry is only safe to fire at all because the idempotency key guarantees it can't double-charge. It pairs with the AWS article's point from the other side: AWS shows that retries spend the server's capacity, and Airbnb's framework at least makes spending it harmless to correctness. Read the breakdown →
Segment
Segment Blog
2018
Another company leaning on this pattern, at industrial scale: retrying is one of Centrifuge's three core jobs, controlled per-job by headers, capped at a four-hour cutoff, and measured. 1.5% of all data succeeds only on a retry, and half of those wins arrive on attempts three through ten. The March outage shows the other edge: the retries peaked at 100,000 requests per second against a partner rated for 16,000 before backoff smoothed the curve. Read the breakdown →
Stripe
Stripe Engineering
2017
The post's 'good distributed citizen' section is a tight statement of this pattern. Back off exponentially (each wait scaling with 2^n) so repeated failures slow the retry rate. Then add random jitter, so that clients knocked out together don't all retry in sync and re-hammer the server (the thundering herd). Stripe's Ruby library ships the full set - retries, keys, backoff, jitter - as its default behavior. Read the breakdown →

Often used together

Patterns sharing breakdowns with this one — derived from co-occurrence, threshold ≥2 shared.

Problems this pattern answers

The walls where its breakdowns live — each opens the cross-company comparison.