【问题标题】:Distributed Task Processing using ZeroMQ使用 ZeroMQ 的分布式任务处理
【发布时间】:2023-03-13 16:35:02
【问题描述】:

我尝试使用 ZMQ - PUSH - PULL 来构建分布式任务处理系统。在 Java 中使用带有队列和侦听器的 JMS 是一种东方做法;空闲的侦听器可以获取队列的消息并执行它。一旦队列分布在节点之间,这就像一个负载均衡器。

使用 ZMQ(使用 Python - 现在不想使用 Celery),我正在尝试 PUSH 和 PULL。工人有不同的处理时间。然而,即使工人有空,任务也会以严格的循环方式进行。这与工人是否空闲无关,任务以循环方式进行。

有没有办法用 ZMQ 模式模拟分布式队列,这样我就可以在每个节点中有一个工作人员池“轮询”队列,并且任何空闲的工作人员都可以从队列中提取消息并进行处理。

【问题讨论】:

  • 是的。有很多你正在寻找的例子in the guide,我强烈建议你阅读它。
  • 我正在阅读它几天现在正在尝试 - github.com/alexcpn/DisProcessor 也是,它正在工作;问题是盲循环,问题是负载均衡
  • 你根本不想要循环,你想要一个空闲的工作人员在准备好时“请求”工作,而经纪人在有一些工作时“回复”第一个请求工作的工作人员。 . 确保您正在阅读 chapter 4, reliable request/reply patterns,从 simple pirate pattern 开始并继续阅读,直到您看到最适合您的场景的模式。

标签: python zeromq


【解决方案1】:

正如 0MQ 创始人Pieter Hintjensthis answer 中指出的那样,PUSH-PULL 机制不是负载均衡器,而是一个简单的循环分发器。这是文档that is still there 中的一个错字。

也就是说,对于负载平衡模式,您需要在架构中间添加一个代理。正如 cmets 中的 Jason 所指出的,这在 the official guide 中得到了很好的解释。 Python中也有例子。

主要想法是让工作人员在有空接收更多工作时向代理发送一个小的“就绪”消息。代理依次保持“指针”以释放队列中的工作人员。当他收到来自客户端的新作业请求时,他还将请求传播到队列中的第一个空闲工作人员,该工作人员从队列中弹出。如上图所示,代理利用 ROUTER 套接字来避免阻塞行为并获得适当的负载平衡。一个额外的小细节是,如果队列中没有空闲的工作人员,代理不会轮询客户端。

这是我所知道的使用 ZeroMQ 实现负载平衡模式的最简单方法。这与队列中的新工作的“轮询”并不完全一样,但我认为这就是你所需要的。另外请注意,这是真的最简单的方法,也就是说,它根本不可靠,也不能很好地扩展。如果你也需要可靠性,建议你通读Chapter 4 of the official guide

作为旁注,也许您应该认真考虑 Celery 来完成这项任务。我真的很喜欢 ZeroMQ,但这正是 Celery 非常擅长的东西,在我看来,它并不像 someone may think 那样难学。

【讨论】:

  • 我也开始使用 Celery 制作原型;现在无法评论答案,因为我忘记了 zeromq 部分;我需要检查并恢复
  • 亲爱的@AlexPunnen,你有没有再次检查过它?无论如何都很乐意提供帮助。祝你好运!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-17
  • 2011-12-10
  • 1970-01-01
  • 2013-10-24
  • 1970-01-01
相关资源
最近更新 更多