Definition · Retry policy, attempts and successA retry policy of r retries makes up to r + 1 attempts at a request, stopping at the first success. If each attempt fails independently with probability p, the expected number of attempts per request is (1 − pʳ⁺¹)/(1 − p) and the probability the request eventually succeeds is 1 − pʳ⁺¹. The ratio of attempts to requests is the amplification factor.
The independence of attempts is a real assumption and it is generous. A request that failed because its payload is malformed will fail again with probability 1, and one that failed because a shard is down will fail again until the shard returns. Retrying a deterministic failure buys nothing and costs the full amplification, which is why policies distinguish retriable errors from the rest.
p = 1/10, r = 2, offered load 500 rps
attempt P(it is ever made) at 500 rps
the request p⁰ = 1 500.0 /s
retry 1 p¹ = 1/10 50.0 /s
retry 2 p² = 1/100 5.0 /s
──────── ────────
attempts = 111/100 = 1.1100 555.0 /s
lost anyway p³ = 1/1000 success = 999/1000 = 99.9000%
share of the load that is retry traffic = 0.11/1.11 = 9.91%
Eleven per cent more load for a hundredfold reduction in loss is an easy trade, and it is the trade every default retry configuration is quietly making. The difficulty is that the eleven per cent is not a constant.
What the same policy costs when things are bad
the same r = 2 policy, at three failure rates
p = 0.10 attempts 1.110 success 99.9000%
p = 0.50 attempts 1.750 success 87.5000%
p = 0.90 attempts 2.710 success 27.1000%
p = 0.99 attempts 2.970 success 2.9701%
as p → 1: attempts → r + 1 = 3, success → 0
Read the two columns together. At a 90% failure rate the policy has nearly tripled the load and is delivering just over a quarter of the requests; at 99% it has tripled the load to deliver three per cent. The load multiplier saturates at r + 1 while the benefit collapses, so the policy is at its most expensive and least useful in the same regime.
Example · Duplicate work under at-least-once deliveryThe same series counts something else. If an attempt can succeed at the server and still be retried — a timeout on the response rather than on the request — then every attempt beyond the first is duplicate work at the server, and the expected duplicates per request are attempts − 1 = p + p² + … + pʳ. At p = 0.1, r = 2 that is 0.11, or 9.91% of the server's work. This is one line of the geometric series rather than a separate model, and it is the reason at-least-once delivery needs idempotent handlers.
Retries multiply along a chain
The factor compounds with depth. A request crossing three tiers, each retrying twice at p = 0.1, produces 1.11 attempts at the first tier, 1.11² at the second and 1.11³ ≈ 1.368 at the third: a 37% surcharge on the innermost service from a policy that looked like 11% at each hop. When the innermost service degrades, every tier above it begins retrying at once and the product is what arrives.
Example · Why retry budgets are per-client, not per-callThe standard mitigation is a cap on the fraction of a client's traffic that may be retries — typically a few per cent — enforced across the client rather than per call site. At p = 0.1 and r = 2 the retry share is 9.91%, already over such a budget, and the budget is what stops the share reaching 66.33%, which is where p = 0.99 puts it. The cap does not make retries cheaper; it makes the amplification bounded by something other than r + 1.
The last figure is the one to carry into the next lesson. A policy whose cost rises with the failure rate, in a system whose failure rate rises with load, is a loop. Nothing in this lesson closes it; the amplification is computed here against a failure probability handed in from outside.