Выбор ответа Middle Celery и очереди спрашивают часто обновлено
Идемпотентная задача списания
Вопрос
Задача списывает оплату у провайдера и может выполниться дважды (acks_late, ретраи). Как не списать деньги два раза?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Ключ идемпотентности у провайдера и атомарный статус платежа в базе. Платёжные API принимают ключ идемпотентности: повторный запрос с тем же ключом вернёт результат первого, а не спишет снова.
Варианты ответа
- Ставить
max_retries=0, тогда задача гарантированно выполнится один раз - Использовать
countdown=5, чтобы повторная доставка успела отмениться - Запускать один воркер с concurrency 1 для всех платёжных задач
- Ключ идемпотентности у провайдера и атомарный статус платежа в базеправильный ответ
Разбор
Платёжные API принимают ключ идемпотентности: повторный запрос с тем же ключом вернёт результат первого, а не спишет снова. В базе платёж атомарно переводят из new в processing (условный UPDATE с проверкой числа строк), чтобы второй экземпляр задачи понял, что работа уже идёт. Отключение ретраев не спасает от повторной доставки после падения воркера, а один воркер не защищает от повторов брокера.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.