Почему очередь на доставку email захлебнулась при ретраях с одинаковым интервалом

Сервис отправки писем упал на тридцать минут — внешний SMTP-провайдер отдавал таймауты. Логика ретраев простая: если отправка не удалась, повторить через фиксированные пять секунд. Провайдер отошёл, а очередь так и не восстановилась ещё два часа после этого.

Проблема не в самом ретрае, а в том, что все накопившиеся за тридцать минут письма ретраились синхронно, одной и той же пачкой, с одинаковым интервалом. Провайдер, только что оживший, сразу получал ту же нагрузку, что и до падения, только теперь — конкурентно от всех накопленных задач сразу. Он снова захлёбывался, ответы снова были таймаутами, и цикл повторялся.

Фиксированный backoff без разброса синхронизирует нагрузку вместо того, чтобы её размазать. Каждый воркер просыпается в одну и ту же секунду и долбит одну и ту же цель.

Что спросят следом на собеседовании: как разброс во времени (jitter) решает эту проблему математически, а не просто «добавь случайное число». Randomized exponential backoff — это не только увеличение интервала между попытками, но и случайная компонента внутри этого интервала, чтобы задачи, попавшие в очередь одновременно, разошлись по времени отправки и не бились в цель синхронным залпом.

Очередь ожила сама, когда нагрузка от старых задач естественным образом растянулась по времени — без единой правки кода, просто время развело попытки.

Тренажёр: 600 вопросов, мок с таймером, план повторов

senior·base — что спрашивают на самом деле


В этом посте были ссылки, но мы их удалили по правилам Сетки