A fixed retry interval is worse than no retry: it hits a struggling dependency at exactly the wrong moment, repeatedly. Exponential backoff — base · 2^attempt, capped — spreads the attempts out.
But backoff alone synchronises. If 500 clients fail at the same instant, they all retry at t+100 ms, then all at t+300 ms: a thundering herd on a tidy schedule. Full jitter decorrelates them:
delay = uniform(0, min(cap, base · 2^attempt))
The cap matters too. Uncapped doubling from a 100 ms base reaches 100 << 13 = 819,200 ms — thirteen and a half minutes — by attempt 13, and a client that has long given up on the user is still holding a connection slot.
The exercise's LCG is seeded deterministically on purpose — a retry policy you cannot reproduce is a retry policy you cannot test. Note attempt 1 drawing 1 ms of jitter: full jitter genuinely can return near-zero, which is why some systems prefer decorrelated jitter with a floor.
