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

Идемпотентная задача списания

Вопрос

Задача списывает оплату у провайдера и может выполниться дважды (acks_late, ретраи). Как не списать деньги два раза?

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

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

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

Коротко

Правильный ответ: Ключ идемпотентности у провайдера и атомарный статус платежа в базе. Платёжные API принимают ключ идемпотентности: повторный запрос с тем же ключом вернёт результат первого, а не спишет снова.

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

  1. Ставить max_retries=0, тогда задача гарантированно выполнится один раз
  2. Использовать countdown=5, чтобы повторная доставка успела отмениться
  3. Запускать один воркер с concurrency 1 для всех платёжных задач
  4. Ключ идемпотентности у провайдера и атомарный статус платежа в базеправильный ответ

Разбор

Платёжные API принимают ключ идемпотентности: повторный запрос с тем же ключом вернёт результат первого, а не спишет снова. В базе платёж атомарно переводят из new в processing (условный UPDATE с проверкой числа строк), чтобы второй экземпляр задачи понял, что работа уже идёт. Отключение ретраев не спасает от повторной доставки после падения воркера, а один воркер не защищает от повторов брокера.

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

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