我有一个带有 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) ?
预先感谢您的任何提示!
Celery 任务有一个
.run()
方法,它将执行任务,就像正常代码流的一部分一样。
create_something.run(pk)
如果需要,您可以捕获异常并执行
.run()
。
当代理关闭时是否可以重试 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/']