Backend-разработка

Очереди в продакшене без боли: идемпотентность и повторные попытки

Ruslan Ismailov Опубликовано 8 мин чтения
О

Почему задача может выполниться дважды

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

Идемпотентность как требование

Идемпотентная задача безопасна для повторного запуска: повторный вызов не меняет результат. Мы достигаем этого уникальными ключами операций и проверками статуса перед выполнением побочных эффектов.

Практические приёмы

  • Уникальный ключ идемпотентности на каждую внешнюю операцию.
  • Проверка текущего статуса записи перед изменением состояния.
  • Уникальные ограничения на уровне базы данных как последний рубеж защиты.

Повторные попытки и backoff

Мы ограничиваем число попыток и используем экспоненциальную задержку с джиттером, чтобы не добивать упавший внешний сервис шквалом ретраев. Терминальные ошибки отправляются в таблицу проваленных задач для ручного разбора.

Наблюдаемость

Мониторинг очередей через панель и метрики позволяет вовремя замечать рост задержек и накопление задач. Без наблюдаемости очереди превращаются в чёрный ящик.

Итоги

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

Технологии

Теги

Руслан Исмаилов

Senior Web / Backend разработчик. Senior web/backend разработчик с 9-летним опытом. Стек: PHP, Laravel, PostgreSQL, Redis, Docker, Kubernetes, REST, микросервисы, CI/CD. Подробнее обо мне →