Skip to main content
 首页 » 编程设计

python之worker 寻址策略

2025年05月04日13artech

我有一个应用程序将一些操作委托(delegate)给 celery 任务。根据某些参数,操作必须由不同的工作人员执行。我考虑过使用队列来实现它。我的想法是:

  1. 客户端请求来自特定消息的操作 queue1
  2. 如果worker1(专门负责queue1)已经激活,它将处理请求
  3. 如果没有 worker 正在监听 queue1,一个 catch-all worker (worker-main) 将实例化 worker1。该请求将转发给 worker1。
  4. worker1 将在一段时间未使用后自行关闭

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

  1. 如何在 celery 中实现 worker-main?:这是一个监听所有队列的 worker,但优先级低于任何其他 worker。也就是说,只有当请求没有被任何其他工作人员接受时,它才会采取行动。
  2. woker-main 如何创建 worker1? 一旦创建者,worker1 必须关联到 queue1,优先级高于worker-main?
  3. 请求可以从worker-main转发到worker1吗?回复应该直接发送给客户端。
  4. worker1 可以自行关闭吗?

您可以在下图中看到我尝试实现的架构的图形描述:

请您参考如下方法:

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

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

请注意,此方法中没有队列的概念。此外,你可以给worker1和worker2不同的方法名,而不是区分参数,客户端可以解析参数,然后选择celery方法执行。