Blog Hoch
May 2026·2 tup leghDe'wI' chenmoHta'

Retry Strategies: Exponential Backoff 'ej Jitter

#backend#reliability#networking

network call Qapbe'. obvious fix "retry" - 'ach naive retry blip full outage choH: client Hoch recovering service wa' poH Daq hammer. Exponential backoff jitter rap standard fix, 15 lines Daq implement laH.

naive retries Qagh law'

downstream service load Daq cha' seconds down. 1000 clients failed request, Hoch retry nom. service recover, 1000 requests wa'logh chu' traffic rap. falls back. retry storm ghaH - blip prolonged outage choH.

cha' Qagh: retries tlhoy' pagh, retries lockstep clients.

exponential backoff: retries space

nom retry pagh, failure Hoch qaSDI' wait law' - delay double.

async function withBackoff(fn, { maxRetries = 5, baseDelayMs = 200, maxDelayMs = 10000 } = {}) {
  let attempt = 0;

  while (true) {
    try {
      return await fn();
    } catch (err) {
      attempt++;
      if (attempt > maxRetries) throw err;

      const delay = Math.min(baseDelayMs * 2 ** (attempt - 1), maxDelayMs);
      await new Promise((resolve) => setTimeout(resolve, delay));
    }
  }
}

baseDelayMs: 200 rap delays 200ms, 400ms, 800ms, 1600ms, 3200ms - nom law', maxDelayMs Dach. "retry nom" fix. "lockstep" fix pagh (clients Hoch same delay sequence).

jitter: lockstep break

client Hoch 200ms, 400ms vaj relative same instant retry. Jitter delay Daq randomness chel: retries time Daq spread (synchronized waves pagh).

function backoffWithFullJitter(attempt, baseDelayMs, maxDelayMs) {
  const cap = Math.min(baseDelayMs * 2 ** attempt, maxDelayMs);
  return Math.random() * cap;
}

"full jitter": delay random 0 'ej exponential cap pIm. AWS architecture blog popularize: plain exponential backoff 'ej "equal jitter" (cap/2 + random cap/2) tlhaQ high contention Daq. widest window retries spread.

retry loop Daq:

async function withBackoffAndJitter(fn, { maxRetries = 5, baseDelayMs = 200, maxDelayMs = 10000 } = {}) {
  let attempt = 0;

  while (true) {
    try {
      return await fn();
    } catch (err) {
      attempt++;
      if (attempt > maxRetries) throw err;

      const delay = backoffWithFullJitter(attempt - 1, baseDelayMs, maxDelayMs);
      await new Promise((resolve) => setTimeout(resolve, delay));
    }
  }
}

failure Hoch retry Dun pagh

blind retry error Hoch: bug. 400 Bad Request pagh 401 Unauthorized identical fail (retry law'). load pagh. transient failures neH retry:

  • network-level errors (connection reset, timeout)
  • 429 Too Many Requests
  • 502, 503, 504 - gateway/upstream failures
function isRetryable(err) {
  if (err.code === 'ECONNRESET' || err.code === 'ETIMEDOUT') return true;
  if (err.status && [429, 502, 503, 504].includes(err.status)) return true;
  return false;
}

backing off qaSpa' legh, others immediate re-throw:

} catch (err) {
  if (!isRetryable(err)) throw err;
  // ...backoff logic
}

Retry-After respect

429 pagh 503 response Retry-After header nob. present vaj lo' (computed delay pagh) - server recovery time Sov.

function delayFromResponse(err, fallbackDelayMs) {
  const retryAfter = err.headers?.['retry-after'];
  if (!retryAfter) return fallbackDelayMs;

  const seconds = Number(retryAfter);
  return Number.isFinite(seconds) ? seconds * 1000 : fallbackDelayMs;
}

total retry budget cap (delay neH pagh)

maxRetries neH vaj logical operation tIn laH: 5 retries 10-second max delay = 30+ seconds. caller timeout ghaj (user wait, queue consumer visibility timeout) vaj elapsed time track 'ej early bail:

async function withDeadline(fn, deadlineMs) {
  const start = Date.now();
  return withBackoffAndJitter(async () => {
    if (Date.now() - start > deadlineMs) {
      throw new Error('retry deadline exceeded');
    }
    return fn();
  });
}

yaj

Exponential backoff retries tlhoy' pagh fix. Jitter lockstep fix. cha' failure retry Dun legh replace pagh, Retry-After header ignore pagh. HTTP client libraries (axios interceptors, got retry, cockatiel, polly .NET) Hoch implement. library lo' (hand-roll pagh) 'ach nuq Qu' Sov (defaults pagh Dun vaj Sov).

chu'Database Transactions 'ej Isolation Levels yajqanWebSockets mach yaj