Exponential backoff spreads a single client’s retries over time and does nothing about a thousand clients retrying in lockstep after one outage.
// synchronised: every client retries at 1s, 2s, 4s, 8s
$delay = 2 ** $attempt;
// full jitter: uniformly random within the window
$delay = random_int(0, (2 ** $attempt) * 1000) / 1000;
// decorrelated jitter, which converges faster
$delay = min($cap, random_int($base, (int) ($prev * 3)));
The recovering-service failure is the one this prevents: a dependency comes back, every waiting client retries at the same instant, and it goes straight down again. Full jitter is the version with the best published behaviour and the one people find least intuitive, because halving the average delay feels like it should be worse. The curve barely matters by comparison — the randomisation is what does the work.