Очередь ретраев, которая сама себе создала затор

Сервис отправки push-уведомлений завязан на внешний провайдер. При ошибке — ретрай с фиксированной задержкой в 5 секунд, до 5 попыток. Провайдер лёг на 10 минут под своей нагрузкой.

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

Результат: провайдер снова деградирует, потому что получает пиковую нагрузку от скопившейся очереди плюс обычный новый трафик. Фиксированный интервал ретраев не учитывает состояние получателя — он просто отсчитывает секунды.

Исправление — экспоненциальный backoff с джиттером вместо фиксированного интервала, плюс circuit breaker, который перестаёт слать запросы при серии отказов и даёт провайдеру время восстановиться без давления очереди. Без джиттера даже экспоненциальный backoff может синхронизировать ретраи разных сообщений в одни и те же моменты времени.

Ретрай с фиксированным интервалом работает, пока сбой короткий. На длинном простое он превращается в собственный DDoS по восстанавливающемуся сервису.

Тренажёр: 900+ вопросов и задач, мок с таймером, план повторов

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


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