Celery Broker 宕机了怎么办?

问题描述 投票:0回答:3

我有一个带有 RabbitMQ 代理的 Celery 服务器。我用它在我的 Django 项目中运行后台任务。

在我的观点之一中,会触发一个信号,然后调用像这样的 celery 任务:

create_something.delay(pk)

任务定义如下:

@task
def create_something(donation_pk):
    # do something

一切都很好,但是:

如果在我调用任务时 RabbitMQ 已关闭,则在 create_something.delay(pk) 调用期间不会抛出任何错误。但视图抛出此错误:

[Errno 111] Connection refused

(堆栈跟踪有点无用,我认为这是因为使用了信号)

现在的问题是:如何防止这个错误?当代理关闭时是否可以重试 create_something.delay(pk) ?

预先感谢您的任何提示!

django rabbitmq celery
3个回答
0
投票

Celery 任务有一个

.run()
方法,它将执行任务,就像正常代码流的一部分一样。

create_something.run(pk)

如果需要,您可以捕获异常并执行

.run()


0
投票

当代理关闭时是否可以重试 create_something.delay(pk)?

调用

.delay()
方法且无法连接时抛出的异常可以像任何其他异常一样被捕获:

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

您可以围绕此构建一个循环来重试,但您应该注意不要让请求持续很长时间。例如,如果您的连接问题需要一秒钟才能解决,您不希望将请求搁置一秒钟。这里的一个选项可能是快速中止,但使用日志记录基础设施,以便将电子邮件发送给站点管理员。一旦我确定了导致连接问题的原因并且确定它无济于事,重试循环将是我要做的“最后”一件事。在大多数情况下,它可以有所帮助,并且重试循环实际上是一个创可贴解决方案。

如何防止此错误?

确保您的经纪商不会倒闭。为了获得更准确的答案,您必须在问题中提供更多诊断信息。

顺便说一句,Celery 有一个“重试任务”的概念,但那是在代理“已经”知道该任务的情况下。不适用于无法联系经纪商的情况。

我对 celery 也有同样的问题,如果rabbitmq服务以任何方式关闭,那么我们的其他rabbitmq代理连接建立的任何规定,或者如果任何人推送的任何下任务被celery启动并接收,我们可以使用多个代理吗? 我使用了经纪人网址列表,例如: BROKER_URL_ENV=['pyamqp://QXqEVFELr_iG80xqW8D-Chk:[email protected]:5672/', 'pyamqp://QXqEViG80xqW8D-Chk:uj10ZtuT-k_tBs@100。 200.100.10:5672/']


0
投票

© www.soinside.com 2019 - 2024. All rights reserved.