техническое · ответ с источниками
Повторные попытки с экспоненциальной задержкой (exponential backoff)
Повторные попытки с экспоненциальной задержкой (exponential backoff) — стратегия обработки ошибок, при которой интервал между последовательными повторами неудавшейся операции растёт экспоненциально. Вместо повторов через фиксированные промежутки система после каждого сбоя ждёт дольше, давая принимающему серверу время восстановиться после перегрузки или временного сбоя.
Как это работает
Процесс начинается с начальной паузы, например в одну секунду. Если первая повторная попытка не удалась, пауза умножается на постоянный коэффициент, обычно на два. Вторая попытка выполняется через две секунды, третья — через четыре, четвёртая — через восемь и так далее. Эта геометрическая прогрессия продолжается, пока не будет достигнут порог максимальной задержки или максимальное число попыток; после этого письмо помечается как окончательно недоставленное.
Почему это важно для отправителей
Такой метод не позволяет отправителю непреднамеренно устроить DoS-атаку (отказ в обслуживании) на принимающий почтовый сервер. Если тысячи писем одновременно не доставлены и все повторяются каждые десять секунд, возникающий всплеск трафика может не дать получателю вернуться в строй. Распределяя повторные попытки во времени, отправители сохраняют лучшую репутацию и повышают вероятность того, что временная SMTP-ошибка 4xx разрешится до того, как письмо будет отброшено.
Что учесть в эксплуатации
Важное дополнение к этой стратегии — джиттер (jitter), небольшой случайный шум, добавляемый к задержке. Без джиттера несколько запросов, завершившихся ошибкой в один момент, будут повторяться синхронными волнами и создавать всплески трафика. Джиттер равномерно распределяет повторы по временному окну, дополнительно снижая нагрузку на инфраструктуру.
Типичные ошибки реализации
Разработчики часто забывают задать максимальное число повторов или верхний предел задержки. Без ограничения пауза может вырасти до часов или дней, что даёт недопустимую задержку для транзакционных писем. Другая ошибка — считать постоянные ошибки 5xx подходящими для повтора: экспоненциальную задержку следует применять только к временным ошибкам 4xx, например при ограничении частоты запросов или временном грейлистинге.
Конкретный пример
Возьмём транзакционное письмо, отправленное через API. Попытка 1 не удаётся из-за ошибки 421 «сервер занят». Система ждёт 2 секунды. Попытка 2 не удаётся — система ждёт 4 секунды. Попытка 3 не удаётся — система ждёт 8 секунд. К моменту попытки 4 принимающий сервер, скорее всего, уже разгрузил очередь и принимает письмо. SendHQ предлагает бесплатные инструменты на https://sendhq.cc/tools, которые помогают эффективно управлять почтовой инфраструктурой.
Что спрашивают команды
Чем фиксированная задержка отличается от экспоненциальной?
При фиксированной задержке повторы выполняются каждые X секунд независимо от числа сбоев. Экспоненциальная задержка увеличивает интервал после каждого сбоя, чтобы снизить нагрузку на целевой сервер.
Когда следует прекращать повторные попытки?
Повторы следует прекращать, когда возвращается постоянная ошибка 5xx, достигнуто максимальное число попыток или верхний предел задержки.
Влияет ли джиттер на экспоненциальный рост?
Нет, джиттер добавляет случайное смещение к рассчитанной экспоненциальной задержке, чтобы избежать синхронных всплесков повторов среди множества одновременных запросов.