我有一个将某些操作委托给芹菜任务的应用程序。根据某些参数,操作必须由不同的工人执行。我已经考虑过使用队列来实现这一点。我的想法如下:
客户端从特定消息queue1
请求操作
如果worker1
(专门负责queue1
)已经处于活动状态,它将处理请求
如果没有工作人员在听queue1
,则所有工作人员(worker-main
)将实例化worker1
。该请求将被转发至worker1
。worker1
将在一段时间后不使用而自行关闭
我对芹菜的了解有限,我有几个问题。
我该如何在celery中实现worker-main
?:这是一个侦听所有队列的工作程序,但其优先级低于任何其他工作程序。也就是说,只有在其他任何工人都不接受请求的情况下,它才会起作用。woker-main
如何创建worker1
?创建者之后,必须将worker1
与queue1
关联,并且优先级高于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方法执行。