Как сравниваются confirm_publish и acks_late в Celery?

Я заметил следующее в документации :

В идеале функции задач должны быть идемпотентными: это означает, что функция не вызовет непредвиденных эффектов, даже если ее вызвать несколько раз с одними и теми же аргументами. Поскольку рабочий не может определить, являются ли ваши задачи идемпотентными, поведение по умолчанию заключается в подтверждении сообщения заранее, непосредственно перед выполнением, так что вызов уже запущенной задачи никогда не будет выполнен снова.

Если ваша задача идемпотентна, вы можете установить опцию acks_late, чтобы рабочий подтвердил сообщение после возвращения задачи. См. также статью FAQ "Что использовать: retry или acks_late?

Если установлено значение True, сообщения для этой задачи будут квитироваться после выполнения задачи, а не перед (поведение по умолчанию).
.
Примечание: Это означает, что задание может быть выполнено несколько раз, если рабочий сломается в середине выполнения. Убедитесь, что ваши задачи идемпотентны.

Тогда есть опция BROKER_TRANSPORT_OPTIONS = {'confirm_publish': True} найденная здесь. Я не смог найти официальной документации для этого.

Я хочу быть уверенным, что задания, отправленные на celery, (1) приходят на celery и (2) в конечном итоге выполняются.

Вот как я думаю это работает:

  • Celery хранит информацию о том, какие задачи должны быть выполнены в брокере (обычно RabbitMQ или Redis)
  • .
  • Приложение (например, Django) отправляет задание в Celery, который немедленно сохраняет его в брокере. confirm_publish подтверждает, что она была добавлена (правильно?). Если confirm_publish установлено, но подтверждение отсутствует, выполняется повторная попытка (верно?).
  • Celery принимает сообщения от брокера. Теперь сельдерей ведет себя как потребитель для брокера. Потребитель подтверждает (подтверждает), что он получил сообщение, и брокер сохраняет эту информацию. Если потребитель не отправил подтверждение, брокер повторно попытается отправить его.

Правильно ли это?

Вернуться на верх