我正在使用zeromq来解决涉及数百个(可能是数千个)客户端请求执行任务的问题.每个客户端都会请求执行特定任务,并且结果在完成后将返回给发出该请求的客户端.
这是我到目前为止已经确定的演员,我提出的模式:
>客户:这是要求执行工作单元(或“工作”)的角色
>控制器:这是在可用引擎上对“作业”进行负载均衡的角色
>引擎:这是从控制器接收作业请求并将结果发布回客户端的actor.
我还没有弄清楚引擎如何将消息传回客户端.我猜测使用zeromq实现这一目的的一种方法是:
Client:
PUSH job messages on one socket to Controller SUBscribe to completed results on PUBlished by Engine, on another
socketController:
PULL job messages from client on one socket PUBlish job messages to engines on another socket (clearly, this will be a forwarding device)Engine:
SUBscribe to job messages on one socket PUBlish result to another socket
如果有人提供了一个框架/片段,它将使用zeromq框架显示如何实现此模式的大纲,这将是最有帮助的.
代码片段可以是C,C,PHP,Python或C#
[[编辑]]
阅读了任务农场(由阿尔法提出).我认为这个问题确实可以通过任务农场建模.我相应地修改了我的原始演员(并且也改变了标题).
如果熟悉zeromq的人能够勾画出一个能够展示我如何使用核心组件来构建这样一个框架的骨架,那将会非常有用.
解决方法:
有多种方法,IPython.parallel包含两个这样的ZeroMQ实现 – 一个简单和纯zmq,另一个更精细,使用Python实现Controller.
我们将Controller分成两个角色:
> Hub – 一个看到所有流量的异常过程,跟踪群集状态,将结果推送到数据库等,通知客户有关引擎连接/断开等的信息.
>调度程序 – 其核心是一个简单的ROUTER-DEALER设备,它将来自客户端的请求转发到引擎,并且回复备份.
只看拓扑的任务耕作部分:
> Scheduler是一个0MQ队列设备,带有ROUTER和DEALER套接字,两者都绑定.
>客户端具有DEALER套接字,连接到Scheduler的ROUTER
>发动机的ROUTER插座连接到Scheduler的DEALER
它利用了这两个属性:
>经销商LRU跨同行的负载均衡请求
> ROUTER使用标识前缀将回复发送回发出特定请求的对等方.
带有pyzmq的玩具负载均衡任务场,它将回复路由回请求客户端:https://gist.github.com/1358832
在0MQ指南中,Ventilator-Sink pattern是另一种选择,其中结果在某处,但不会返回到请求客户端.