使用ZeroMQ进行分布式任务处理

时间:2015-07-06 14:34:39

标签: python zeromq

我试图使用ZMQ - PUSH - PULL来构建分布式任务处理系统。这是在Java中使用带有队列和侦听器的JMS;使用自由的侦听器可以获取队列的消息并执行它。一旦队列分布在节点上,这就像负载均衡器一样。

使用ZMQ(使用Python - 现在不想使用Celery),我尝试了PUSH和PULL。与工人有不同的处理时间。然而,即使工人是自由的,任务也是严格循环的。无论工人是否有空,这项任务都是循环的。

有没有办法模拟带有ZMQ模式的分布式队列,这样我就可以让一个工作池“轮询”每个节点中的队列,并且可以自由地从队列中提取消息并处理它。

1 个答案:

答案 0 :(得分:1)

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

也就是说,对于负载平衡模式,您需要在架构中间添加代理。正如Jason在评论中指出的那样,the official guide对此进行了详细解释。 Python中也有一些例子。

enter image description here

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

这是我了解使用ZeroMQ实现负载均衡模式的最简单方法。对于队列中的新作业来说,它并不完全像“轮询”,但我认为这就是您所需要的。另外请注意,这是真正最简单的方式,也就是说,它根本不可靠,并且不能很好地扩展。如果您还需要可靠性,建议您仔细阅读Chapter 4 of the official guide

作为旁注,也许你应该认真考虑Celery来完成这项任务。我真的爱上了ZeroMQ,但这正是Celery非常擅长的事情,而且我认为它并不像someone may think那样难学。