预计到达时间较长的Celery任务和RabbitMQ

hiz5n14c  于 2022-11-08  发布在  RabbitMQ
关注(0)|答案(5)|浏览(195)

RabbitMQ可能会对使用者强制执行确认超时:https://www.rabbitmq.com/consumers.html#acknowledgement-modes默认情况下,如果任务未在15分钟内确认,则整个节点将关闭,并显示PreconditionFailed错误。我需要安排一个celery任务(使用RabbitMQ作为代理),ETA在很远的将来(1-3小时)和截至目前(使用Celery 4和Rabbitmq 3.8)当我尝试这样做时......在为我的RMQ配置的消费者确认超时之后,我得到了PreconditionFailed。我原以为这项任务会在预计到达时间之前被确认。

是否有办法将ETA celery任务配置为在使用者确认超时内确认?

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

7hiiyaii

7hiiyaii1#

我认为调整consumer_timeout是Celery 5中的唯一选项。请注意,这仅适用于RabbitMQ 3.8.15和更新版本。
另一个可能的解决方案是让工作线程在收到消息后立即确认消息。只有在不需要保证任务完成时才这样做。例如,如果工作线程在执行任务之前崩溃,Celery将不知道任务没有完成。
在RabbitMQ中,延迟任务的最佳选择是delayed-message-exchange或dead lettering。Celery不能使用这两种选择。在Celery中,消息被发布到消息代理,在那里它们被尽快发送给消费者。延迟是在工作者中强制的,而不是在代理中。

t9eec4r0

t9eec4r02#

通过在RabbitMQ服务器上运行以下命令,可以为正在运行的示例更改此consumer_timeout
rabbitmqctl eval 'application:set_env(rabbit, consumer_timeout, 36000000).'
这会将新的超时设置为10小时(36000000毫秒)。要使此设置生效,您需要重新启动工作进程。现有的工作进程连接将继续使用旧的超时。
您还可以检查当前配置的超时值:
rabbitmqctl eval 'application:get_env(rabbit, consumer_timeout).'
如果您正在通过Docker映像运行RabbitMQ,下面是如何设置该值:只需将-e RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS="-rabbit consumer_timeout 36000000"添加到您的docker run,或者将环境RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS设置为"-rabbit consumer_timeout 36000000"
希望这对你有帮助!

azpvetkf

azpvetkf3#

我遇到了这个问题,实际上我认为你最好使用PeriodicTask,如果你只想做一次,设置one_off=True。
https://docs.celeryq.dev/en/stable/userguide/periodic-tasks.html?highlight=periodic

nhaq1z21

nhaq1z214#

我遇到了同样的问题,我解决了它。
使用RabbitMQ版本3.8.14(3.8.14-management),我能够发送较长的ETA任务。
我个人使用Celery发送ETA较长的任务。在我的情况下,我设置了Celery添加超时(~consumer_timeout),我可以使用time_limit或soft_time_limit对其进行配置

3xiyfsfu

3xiyfsfu5#

我也想做一些类似的事情,并尝试了“rabbitmq-delayed-exchange-plugin”和“dead-letter-queue”。我写了一篇关于这两种方法的文章,并在下面提到了链接。我希望它会对某些人有帮助。简而言之,我们可以使用这两种方法来安排celery 任务(处理长ETA)。

using dlx:(第一个字母)

**死信交换(DLX):**x1c 0d1x

using RabbitMQ Delayed Message Plugin:(一个词)

RabbitMQ延迟消息插件:

p.s:我知道StackOverflow的答案应该是不言自明的,但张贴的链接作为答案是长。对不起

相关问题