我有一个应用程序将一些操作委托(delegate)给 celery 任务。根据某些参数,操作必须由不同的工作人员执行。我考虑过使用队列来实现它。我的想法是:
- 客户端请求来自特定消息的操作
queue1 - 如果
worker1(专门负责queue1)已经激活,它将处理请求 - 如果没有 worker 正在监听
queue1,一个 catch-all worker (worker-main) 将实例化worker1。该请求将转发给worker1。 worker1将在一段时间未使用后自行关闭
我对celery的了解有限,有几个问题。
- 如何在 celery 中实现
worker-main?:这是一个监听所有队列的 worker,但优先级低于任何其他 worker。也就是说,只有当请求没有被任何其他工作人员接受时,它才会采取行动。 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方法执行。
