具有较长 ETA 和 RabbitMQ 的 Celery 任务

Celery task with a long ETA and RabbitMQ

RabbitMQ 可能会强制消费者确认超时:https://www.rabbitmq.com/consumers.html#acknowledgement-modes 默认情况下,如果一个任务在 15 分钟内没有被确认,整个节点将关闭并出现 PreconditionFailed 错误。 我需要在很远的将来(1-3 小时)和现在(使用 celery 4 和 rabbitmq 3.8)安排一个带有 ETA 的 celery 任务(使用 RabbitMQ 作为代理),当我尝试...我得到 PreconditionFailed 在为我的 RMQ 配置的消费者确认超时之后。 我预计该任务会在预计到达时间之前得到确认...

有没有办法将 ETA 芹菜任务配置为在消费者确认超时内得到确认?

现在我正在将 consumer_timeout 增加到我的预计到达时间增量之上,但必须有更好的解决方案...

我认为调整 consumer_timeout 是您在 Celery 5 中唯一的选择。请注意,这仅适用于 RabbitMQ 3.8.15 和更新版本。

另一种可能的解决方案是让工作人员在收到消息后立即确认。仅当您不需要保证任务完成时才这样做。例如,如果 worker 在执行任务之前崩溃了,Celery 将不知道它没有完成。

在 RabbitMQ 中,延迟任务的最佳选择是延迟消息交换或死信。 Celery 不能使用任何一个选项。在 Celery 中,消息被发布到消息代理,在那里它们被尽快发送给消费者。延迟是在 worker 中强制执行的,而不是在 broker 中。

我遇到了这个问题,实际上我认为你最好使用 PeriodicTask,如果你只想在设置 one_off=True 后使用它。

https://docs.celeryq.dev/en/stable/userguide/periodic-tasks.html?highlight=periodic