Как сравниваются 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 принимает сообщения от брокера. Теперь сельдерей ведет себя как потребитель для брокера. Потребитель подтверждает (подтверждает), что он получил сообщение, и брокер сохраняет эту информацию. Если потребитель не отправил подтверждение, брокер повторно попытается отправить его.
Правильно ли это?