Выбор ответа Middle Celery и очереди спрашивают часто обновлено
Задача стартует раньше коммита
Вопрос
Задача process_order.delay(order.id) ставится внутри transaction.atomic() сразу после создания заказа. Воркер иногда не находит заказ. Что исправит проблему?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Ставить задачу через transaction.oncommit, чтобы она ушла после коммита. Сообщение попадает в брокер сразу, а коммит происходит позже, и быстрый воркер читает базу до него. oncommit откладывает постановку до успешного коммита, а при откате задача не уйдёт вовсе. sleep лишь снижает вероятность, больше воркеров…
Варианты ответа
- Добавить
time.sleep(1)в начало задачи, чтобы коммит успел пройти - Ставить задачу через
transaction.on_commit, чтобы она ушла после коммитаправильный ответ - Увеличить число воркеров, чтобы задача забиралась равномерно и позже
- Передать в задачу объект заказа вместо id, чтобы не читать его из базы
Разбор
Сообщение попадает в брокер сразу, а коммит происходит позже, и быстрый воркер читает базу до него. on_commit откладывает постановку до успешного коммита, а при откате задача не уйдёт вовсе. sleep лишь снижает вероятность, больше воркеров её повышают, а объект заказа сделает данные устаревшими.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.