【发布时间】:2015-12-11 13:58:03
【问题描述】:
我有一个长时间运行的 celery 任务,它遍历一组项目并执行一些操作。
任务应该以某种方式报告它当前正在处理的项目,以便最终用户知道任务的进度。
目前我的 django 应用程序和 celery 一起在一台服务器上,所以我可以使用 Django 的模型来报告状态,但我计划添加更多远离 Django 的工作人员,所以他们无法访问数据库。
现在我看到几个解决方案:
- 使用一些存储手动存储中间结果,例如 redis 或 mongodb,然后在网络上可用。这让我有点担心,因为例如,如果我将使用 redis,那么我应该在 Django 端保持同步读取状态的代码和写入状态的 Celery 任务,因此它们使用相同的键。
- 使用 REST 调用从 celery 向 Django 报告状态。喜欢
PUT http://django.com/api/task/123/items_processed - 也许使用 Celery 事件系统并创建像
Item processed这样 django 更新计数器的事件 - 创建一个单独的worker,它在一个带有django的服务器上运行,它持有一个只会增加
items proceeded计数的任务,所以当任务完成一个项目时它会发出increase_messages_proceeded_count.delay(task_id)。
我提到的有什么解决办法或隐藏的问题吗?
【问题讨论】:
-
为什么他们不能到达数据库?
-
因为我想减少耦合,不想暴露DB。
-
我可以理解这一点,并且我将工作人员设计为尽可能解耦,但对于我为工作人员设计的工作负载,如果它知道一些事情(例如,可以访问数据库),那么它的能力会更强。我可以看到不需要 Django DB 的任务,例如“生成 PDF”或“渲染此图像”。我只是想知道你是否需要它或者你想要它。我将在下面的答案中详细说明。