我有一个将某些操作委托给芹菜任务的应用程序。根据某些参数,操作必须由不同的工人执行。我已经考虑过使用队列来实现这一点。我的想法如下:


客户端从特定消息queue1请求操作
如果worker1(专门负责queue1)已经处于活动状态,它将处理请求
如果没有工作人员在听queue1,则所有工作人员(worker-main)将实例化worker1。该请求将被转发至worker1
worker1将在一段时间后不使用而自行关闭


我对芹菜的了解有限,我有几个问题。


我该如何在celery中实现worker-main ?:这是一个侦听所有队列的工作程序,但其优先级低于任何其他工作程序。也就是说,只有在其他任何工人都不接受请求的情况下,它才会起作用。
woker-main如何创建worker1?创建者之后,必须将worker1queue1关联,并且优先级高于worker-main
是否可以将请求从worker-main转发到worker1?回复应直接发送给客户端。
worker1是否可以自行关闭?


您可以在下图中看到我要实现的体系结构的图形描述:

最佳答案

您可以在顺序工作流中将“ worker main”和“ worker1”链接在一起,以便“ worker main”始终按步骤1处理该作业,但是如果检测到“ worker1”已经启动,则仅返回并不执行任何操作。

因此,任务首先命中“ worker main”,“ worker main”检查worker1正在运行的服务器的正常性,如果该服务器未启动,则将其拉起,等待其完全启动,然后返回。这是我测试过的proof of concept,以查看链接如何在Celery中创建顺序工作流程,具有更多实际经验的人可能有更好的解决方案。它也包含错误处理,以防我认为在您的情况下无法启动工作程序。

注意,这种方法没有队列的概念。此外,您可以为worker1和worker2提供不同的方法名称,而不用区分参数,客户端可以解析参数,然后选择celery方法执行。

09-11 11:40