Калькулятор экспоненциальной задержки (backoff)
Задайте первую задержку, множитель, максимальную задержку и число повторов — и увидите расписание, по которому пойдёт ваш цикл повторов, сколько всего может ждать запрос и как его меняет полный или равный джиттер.
Работает в браузере: всё, что вы вводите, никуда не отправляется.
Как пользоваться
- Введите первую задержку в миллисекундах и множитель (2 — удвоение каждый раз).
- Задайте максимальную задержку (0 — без ограничения) и число повторов.
- Выберите вид джиттера и смотрите таблицу и итоги.
Формула
delay(n) = min(максимум, первая задержка × множитель^(n − 1))
С полным джиттером фактическая задержка случайна в пределах [0, delay(n)], с равным — в пределах [delay(n) ÷ 2, delay(n)]. Итоги складывают самые короткие, средние и самые длинные значения каждого повтора.
Разобранный пример
Первая задержка 500 мс, множитель 2, максимум 30 с, 8 повторов: задержки — 0,5, 1, 2, 4, 8 и 16 с, а 32 и 64 с обрезаются до 30 с. Самое долгое общее ожидание — 0,5 + 1 + 2 + 4 + 8 + 16 + 30 + 30 = 91,5 с, оно показывается округлённо: 1 min 32 s. С полным джиттером среднее общее ожидание вдвое меньше — 45,75 с.
Советы
- Если сервер прислал заголовок Retry-After, соблюдайте его: он важнее вашего расписания.
- Ограничьте цикл не только числом повторов, но и общим сроком (дедлайном).
- Пишите в лог номер попытки, чтобы видеть в продакшене, как часто случаются повторы.
Частые вопросы
Что такое экспоненциальная задержка (exponential backoff)?
Стратегия повторов, при которой каждая пауза длиннее предыдущей, обычно вдвое. Сбойный сервис получает передышку, а клиенты не засыпают его повторами. Задержка перед повтором n равна первой задержке × множитель^(n − 1), но не больше максимума.
Зачем добавлять джиттер?
Если много клиентов получили ошибку одновременно, одинаковое расписание заставит их и повторять одновременно. Джиттер (случайный разброс) разводит их во времени. Полный джиттер берёт случайную задержку от 0 до расчётной, равный оставляет половину расчётной, а вторую половину делает случайной.
Какую максимальную задержку выбрать?
Зависит от того, сколько может ждать вызывающая сторона. Для интерактивных запросов максимум обычно — несколько секунд, и после нескольких повторов они сдаются; фоновые задачи могут ждать минутами. Общее время ожидания здесь показывает, укладывается ли расписание в ваш тайм-аут.
Нужно ли повторять запрос при любой ошибке?
Нет. Повторяйте при тайм-аутах, ошибках соединения и ответах вроде 429 или 503, которые говорят о временной проблеме. Ошибки вроде 400 или 404 повторятся снова. Повторяйте только операции, которые безопасно выполнить ещё раз, или сначала сделайте их идемпотентными.