rabbitmq 当celery 经纪人倒下时该怎么办?

oo7oh9g9  于 2023-10-20  发布在  RabbitMQ
关注(0)|答案(2)|浏览(114)

我有一个Celery服务器和一个RabbitMQ代理。我用它来运行Django项目中的后台任务。
在我的一个视图中,一个信号被触发,然后调用一个celery 任务,如下所示:

create_something.delay(pk)

任务的定义如下:

@task
def create_something(donation_pk):
    # do something

一切都很好,但是:
如果RabbitMQ在我调用任务时关闭,则在create_something.delay(pk)调用期间不会抛出错误。但该视图抛出了这个错误:

[Errno 111] Connection refused

(The堆栈跟踪是一种无用的,我认为这是因为使用的信号)
现在的问题是:我如何防止这种错误?当代理关闭时,是否有可能执行create_something.delay(pk)的重试?
提前感谢任何提示!

s5a0g9ez

s5a0g9ez1#

Celery tasks有一个.run()方法,它将执行任务,因为它是正常代码流的一部分。

create_something.run(pk)

您可以捕获异常并在需要时执行.run()

ryoqjall

ryoqjall2#

当代理关闭时,是否有可能执行create_something.delay(pk)的重试?
当您调用.delay()方法并且无法连接时抛出的异常可以像任何其他异常一样被捕获:

try:
    foo.delay()
except <whatever exception is actually thrown>:
    # recover

你可以围绕这个构建一个循环来重试,但是你应该注意不要让请求保持很长时间。例如,如果连接问题需要整整一秒钟才能得到解决,那么您不希望将请求延迟整整一秒钟。这里的一个选项可能是快速中止,但使用日志基础设施,以便向站点管理员发送电子邮件。一旦我确定了导致连接问题的原因,并且我确定它无法帮助,重试循环将是我做的最后一件事。在大多数情况下,它 * 可以 * 是有帮助的,重试循环实际上是一个创可贴解决方案。
我如何防止这种错误?
确保你的经纪人不会倒下。为了得到更准确的答案,你必须在问题中提供给予更多的诊断信息。
顺便说一下,Celery有一个重试任务的概念,但这是当任务 * 已经 * 为代理所知时。它不适用于您无法联系经纪人的情况。

相关问题