我正在整理一个基于 Celery 的数据摄取管道。我在文档中没有看到的一件事是如何构建一个流程,其中工人仅在有工作要完成时才运行。(老实说,这似乎是芹菜设计中的一大缺陷)
我知道 Celery 本身不会处理实际服务器的自动缩放,这很好,但是当我模拟这个时,Flower 看不到提交的工作,除非提交任务时工作人员在线。为什么?我希望有一个除非有实际工作要做,否则我不为服务器付费的世界。
工作流程:
-
想象一个 While 循环,它添加要使用
celery_app.send_task
方法处理的新数据。 -
我有自定义代码,可以看到队列中有 N 条消息。它启动一个服务器,并为该任务启动一个 Celery 工作线程。
-
芹菜工人上线,并完成工作。
但。
Flower没有该任务的记录,即使我看到经纪人有一个"消息",并且在观察工人的输出时,我可以看到它做了它的事情。
如果我让工作人员保持在线,然后提交任务,它会很好地监控一切。
有人知道为什么吗?
您可以使用芹菜自动缩放。例如,将自动缩放设置为 8 意味着它将触发最多 8 个进程来处理队列。不过,它将有一个主进程等待。您还可以设置最小值,例如 2-8,它将有 2 个工作人员等待,但如果需要,会再启动一些(最多 8 个)(然后在队列为空时缩小)。
这是基于进程的自动缩放程序。如果要创建基于云的自动缩放程序,则可以将其用作参考,例如,启动新节点而不仅仅是进程。
至于你的花问题,如果不了解你的经纪人(redis/兔子/等),很难说。Flower 不会捕获所有内容,因为它依赖于代理执行此操作,并且某些配置会导致代理删除诸如运行的任务之类的信息。