Очереди в продакшене без боли: идемпотентность и повторные попытки
Почему задача может выполниться дважды
Воркеры очередей повторяют задачи при сбоях, а значит любая задача может выполниться от одного до нескольких раз. Если не закладывать это в дизайн, повторное выполнение приводит к двойным списаниям, дублям писем и рассогласованию данных.
Идемпотентность как требование
Идемпотентная задача безопасна для повторного запуска: повторный вызов не меняет результат. Мы достигаем этого уникальными ключами операций и проверками статуса перед выполнением побочных эффектов.
Практические приёмы
- Уникальный ключ идемпотентности на каждую внешнюю операцию.
- Проверка текущего статуса записи перед изменением состояния.
- Уникальные ограничения на уровне базы данных как последний рубеж защиты.
Повторные попытки и backoff
Мы ограничиваем число попыток и используем экспоненциальную задержку с джиттером, чтобы не добивать упавший внешний сервис шквалом ретраев. Терминальные ошибки отправляются в таблицу проваленных задач для ручного разбора.
Наблюдаемость
Мониторинг очередей через панель и метрики позволяет вовремя замечать рост задержек и накопление задач. Без наблюдаемости очереди превращаются в чёрный ящик.
Итоги
Идемпотентность, разумные повторные попытки и мониторинг превращают очереди из источника инцидентов в надёжный механизм фоновой обработки, которому можно доверять денежные операции.
Технологии
Теги
Руслан Исмаилов
Senior Web / Backend разработчик. Senior web/backend разработчик с 9-летним опытом. Стек: PHP, Laravel, PostgreSQL, Redis, Docker, Kubernetes, REST, микросервисы, CI/CD. Подробнее обо мне →