Надёжные фоновые задачи
Вопрос
Как вы сделаете фоновые задачи надёжными: чтобы они не терялись и не выполнялись с повторным эффектом?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Постановка после коммита или outbox
acks_late и reject_on_worker_lost для гарантии выполнения
Идемпотентность: проверка состояния, уникальные ключи, ключ идемпотентности во внешних API
Ретраи только временных ошибок с backoff, лимит попыток
Лимиты времени, мониторинг очередей и упавших задач
Передача id, а не объектов; маленькие задачи
Что могут спросить следом
- Что будет с задачей при деплое и перезапуске воркеров?
- Как вы мониторите очереди?
Разбор
Образцовый ответ: «Начинаю с постановки: задача, которая читает новые данные, уходит через transaction.on_commit, а для важных событий использую outbox, чтобы публикация была атомарной с данными. Дальше гарантия выполнения: acks_late=True и task_reject_on_worker_lost=True, тогда задача вернётся в очередь при падении или перезапуске воркера. Раз возможны повторы, каждая задача идемпотентна: перед действием проверяю состояние, захватываю работу атомарным условным UPDATE, во внешние API передаю ключ идемпотентности, вставки делаю с уникальными ключами. Ретраи настраиваю только на временные ошибки с экспоненциальной задержкой, джиттером и пределом попыток, а исчерпавшие попытки задачи логирую и алертю. Ставлю soft_time_limit и time_limit. В задачу передаю id и мелкие данные. Мониторю длину очередей, возраст самого старого сообщения, долю ошибок и время выполнения, например через Flower или метрики в Prometheus».
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.