Экспоненциальный backoff
Ретраи с растущей задержкой и джиттером: 2^n с рандомом.
1async function retryWithBackoff(2 fn: () => Promise<void>,3 baseMs = 200,4 maxAttempts = 5,5): Promise<void> {6 const jitter = () => 0.5 + Math.random() * 0.5 // 50–100%7 8 for (let attempt = 1; attempt <= maxAttempts; attempt++) {9 try {10 await fn()11 return12 } catch (e) {13 if (attempt === maxAttempts) throw e14 const delay = baseMs * 2 ** (attempt - 1) * jitter()15 await new Promise((r) => setTimeout(r, delay))16 }17 }18}Проблема
Ретраи с растущей задержкой и джиттером: 2^n с рандомом.
Что вы видите
Таймлайн попыток: паузы удваиваются, джиттер разводит клиентов.
Как это работает
Сбой — не повод DDoS-ить сервер ретраями. Экспоненциальный рост + джиттер (разводящий клиентов) — стандарт retry-политик, gRPC, AWS SDK.
Пошаговый разбор
- 01
Задержка
base · 2^attempt · jitter.
- 02
Джиттер
0.5–1: клиенты не синхронны.
- 03
Кап
Максимум попыток — и вверх по ошибке.
Complexity и ограничения
См. complexity в шапке страницы.
Edge cases
- Пустой вход
Корректно завершается без лишних шагов.
- Вырожденный случай
Минимум работы — сразу ответ.
Где встречается в реальности
Продукт
Классический приём в реальных системах.
Собеседования
Стандартный вопрос на понимание структуры.
«Ошибка? Подожди. Ещё ошибка? Подожди дольше»
Тот же сценарий StepSequence в вертикальной композиции — с safe zones и записью WebM ниже на странице.
Shorts 9:16
Вертикальная композиция строится той же последовательностью шагов, что и страница: safe zones отмечены пунктиром (там живёт UI платформ), биты сценария подсвечиваются по прогрессу. Кнопка записи сохраняет WebM — детерминированная StepSequence даёт воспроизводимый ролик без монтажа.