Выбор ответа Middle Celery и очереди спрашивают часто обновлено

Задача стартует раньше коммита

Вопрос

Задача process_order.delay(order.id) ставится внутри transaction.atomic() сразу после создания заказа. Воркер иногда не находит заказ. Что исправит проблему?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Ставить задачу через transaction.oncommit, чтобы она ушла после коммита. Сообщение попадает в брокер сразу, а коммит происходит позже, и быстрый воркер читает базу до него. oncommit откладывает постановку до успешного коммита, а при откате задача не уйдёт вовсе. sleep лишь снижает вероятность, больше воркеров…

Варианты ответа

  1. Добавить time.sleep(1) в начало задачи, чтобы коммит успел пройти
  2. Ставить задачу через transaction.on_commit, чтобы она ушла после коммитаправильный ответ
  3. Увеличить число воркеров, чтобы задача забиралась равномерно и позже
  4. Передать в задачу объект заказа вместо id, чтобы не читать его из базы

Разбор

Сообщение попадает в брокер сразу, а коммит происходит позже, и быстрый воркер читает базу до него. on_commit откладывает постановку до успешного коммита, а при откате задача не уйдёт вовсе. sleep лишь снижает вероятность, больше воркеров её повышают, а объект заказа сделает данные устаревшими.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.