🐍
Code Snippet — August 5, 2026JavaScript: Retry with Exponential Backoff, Jitter & Circuit Breaker
setTimeout + recursive fetch is fragile — no jitter (thundering herd), no circuit breaker (keeps hammering dead services). This
retry() wraps any async op with
exponential backoff,
4 jitter strategies,
circuit breaker (open → half-open → closed),
retry predicates (retry 5xx/429, skip 4xx),
per-call timeout, and
retryFetch drop-in wrapper. Zero deps — Node, browser, Deno, Bun.
const response = await retry(() => api.fetchUser(id), {
attempts: 5, baseDelay: 1000, maxDelay: 30000,
strategy: "jitter", // jitter | full_jitter | decorrelated | exponential
shouldRetry: e => e.status >= 500 || e.status === 429,
circuitBreaker: { threshold: 5, cooldownMs: 10000 },
timeout: 5000,
onRetry: (n, delay) => log(`retry ${n}, ${delay}ms`),
});
// Or use the drop-in fetch wrapper:
const res = await retryFetch("https://api.example.com/data");
💡 Drop in utils/retry.js — never write retry logic inline again. Full version w/ 10 self-tests in workspace.