Celery在远程任务上使用Django Result Backend

时间:2019-01-21 15:53:16

标签: python django rabbitmq celery

我有一个使用Celery创建异步任务的Django应用程序。其中一些任务位于Django项目中,而其他任务则位于具有自己代码库的远程工作器中。

我目前使用django-celery-results包将任务调用的结果存储在Django数据库中,以便可以使用Django ORM轻松查询调用的状态。当我调用“本地”任务时,此方法工作正常,但在调用远程任务时,效果似乎不佳。

例如:

app.send_task("django.foo")  # Return status SUCCESS and store result in DB
app.send_task("remote.bar")  # Stuck in PENDING and never create result in DB

通过阅读Celery Docs,我发现如果客户和工作人员未使用相同的CELERY_RESULT_BACKEND设置,则任务可能会被挂起。在这种情况下,我不能在远程工作程序上使用django-db后端,因为它不是Django应用程序。

所以在这种情况下...当以这种方式进行远程调用时,如何存储结果?

请注意,在remote.bar的情况下,我确认远程工作者已收到消息并执行了该方法。只是我的客户端(Django App)没有收到响应。

2 个答案:

答案 0 :(得分:0)

n.b。,如果不同的celery工作者正在使用不同的结果后端,则可以动态配置app实例。

from celery.app import Celery
app = Celery(broker_url='my_broker_url', result_backend='non-django-orm backend')
result = app.send_task('remote.bar')
# you can check status here just fine.

如果您想支持这样的配置,您将需要多个工作人员,因为每个工作人员只能将结果连接并存储到单个后端。

答案 1 :(得分:0)

正如已经回答的其他答案一样,您可以设置result_backend。我必须用Celery(result_backends=....)来指定它,因为我在Django设置中设置的SQL地址URL被忽略了。但是,这种方法的问题是您需要提供 直接访问数据库,这使事情变得简单,但如果您的芹菜工人需要位于其他网络中,则不安全。

如果需要考虑安全性,则必须创建API来更新客户端的结果。这是有关这种方法的更多说明。

REST API or "direct" database access for remote Celery/Django workers?