使用zeromq实现任务场消息传递模式

时间:2011-10-18 14:47:09

标签: php c++ python c zeromq

我正在使用zeromq来解决涉及数百个(可能是数千个)客户端请求执行任务的问题。每个客户端都会请求执行特定任务,并且结果在完成后将返回给发出该请求的客户端。

这些是我到目前为止所确定的演员,按照我提出的模式:

  • 客户:这是要求执行工作单元(或“工作”)的演员
  • 控制器:这是对可用引擎的“作业”进行负载均衡的角色
  • 引擎:这是从控制器接收作业请求并将结果发布回客户端的actor。

我还没有弄清楚引擎如何将消息传回客户端。我猜测使用zeromq实现这一目标的一种方法是:

  

客户端:
  将一个套接字上的作业消息发送到控制器会在另一个套接字上创建由PUBlished完成的结果   插座

     

控制器:
  从一个套接字上的客户端获取作业消息PUBlish作业消息到另一个套接字上的引擎(显然,这将是一个转发设备)

     

发动机:
  订阅一个套接字上的作业消息PUBlish结果到另一个套接字

如果有人提供了一个骨架/片段,它将使用zeromq框架显示如何实现此模式的大纲,这将是最有帮助的。

代码段可以是C,C ++,PHP,Python或C#

[[编辑]]

阅读任务农场(由阿尔法提出)。我认为这个问题确实可以通过任务农场建模。我相应地修改了我的原始演员(并且也更改了标题)。

如果熟悉zeromq的人可以勾画出一个能够展示我如何使用核心组件来构建这样一个框架的骨架,那将是非常有用的。

2 个答案:

答案 0 :(得分:5)

有很多方法,IPython.parallel包括ZeroMQ的两个这样的实现 - 一个简单和纯zmq,另一个更精细,使用Python实现Controller。

我们将Controller分成两个角色:

  1. 集线器 - 一个看到所有流量的远程进程,跟踪集群状态,将结果推送到数据库等,通知客户端有关引擎连接的信息/ disconnect等。
  2. 计划程序 - 其核心是一个简单的ROUTER-DEALER设备,可将客户端的请求转发给引擎,并回复备份。
  3. 仅查看拓扑的任务耕作部分:

    • Scheduler是一个0MQ Queue设备,带有ROUTER和DEALER套接字,两者都绑定。
    • 客户端有DEALER套接字,连接到Scheduler的ROUTER
    • 引擎将ROUTER套接字连接到Scheduler的DEALER

    利用这两个属性:

    • 在各个对等方面处理LRU负载均衡请求
    • ROUTER使用身份前缀将回复发送回发出特定请求的对等方。

    带有pyzmq的玩具负载均衡任务服务器场,它将回复路由回请求客户端:https://gist.github.com/1358832

    结果在某处,但不是备份到请求客户端的替代方案是0MQ指南中的Ventilator-Sink pattern

答案 1 :(得分:3)

这是一种经典的主/从并行模式(也称为“农场”或“任务农场”)。

有十亿种方法可以实现它。 Here有一种方法可以使用MPI实现它,也许它可以鼓舞你在zeromq中实现它。