【问题标题】:Implementing Task Farm messaging pattern with zeromq使用 zeromq 实现任务场消息模式
【发布时间】:2011-12-10 04:28:48
【问题描述】:

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

这些是到目前为止我已经确定的演员,在我想出的模式中:

  • 客户端:这是请求执行工作单元(或“工作”)的参与者
  • 控制器:这是跨可用引擎对“作业”进行负载平衡的参与者
  • Engine:这是从控制器接收作业请求并将结果发布回客户端的参与者。

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

客户:
将一个套接字上的作业消息推送到控制器订阅以完成由引擎发布的结果,在另一个 插座

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

引擎:
订阅一个套接字上的作业消息 PUBlish 结果到另一个套接字

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

代码 sn-p 可以是 C、C++、PHP、Python 或 C#

[[编辑]]

在阅读了 Task Farms 之后(根据 akappa 的建议)。我认为这个问题确实可以通过任务农场来建模。我已经相应地修改了我的原始演员(并且也更改了标题)。

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

【问题讨论】:

  • 唯一让我大吃一惊的是,客户和工人似乎是同一回事。他们都请求一个工作单元,完成它并在完成后回复。
  • @CodeReaper:不完全是——也许我最初的问题没有很好地形成。在 akappa 指出我正确的方向后,我更新了问题。

标签: php c++ python c zeromq


【解决方案1】:

有多种方法可以解决这个问题,IPython.parallel 包括两个这样的 ZeroMQ 实现——一个简单的纯 zmq,另一个更复杂,控制器用 Python 实现。

我们将Controller分成两个actor:

  1. Hub - 查看所有流量、跟踪集群状态、将结果推送到数据库等的隐蔽进程,通知客户端引擎连接/断开连接,等
  2. Scheduler - 其核心是一个简单的 ROUTER-DEALER 设备,它将来自客户端的请求转发到引擎,并备份回复。

只看我们拓扑的任务农业部分:

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

利用了这两个属性:

  • DEALERS LRU 跨对等方的负载平衡请求
  • ROUTER 使用身份前缀将回复发送回发出特定请求的对等方。

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

0MQ 指南中的Ventilator-Sink pattern 是另一种方法,结果会到达某个地方,但不会备份到请求的客户端。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • +1 用于识别建模此问题的模式。我查看了您提供的链接并正在研究代码。如果没有人能够提出一个显示如何使用 zeromq 实现此模式的 sn-p/outline,我将默认接受您的回答。
    猜你喜欢
    • 2014-08-28
    • 2017-05-06
    • 1970-01-01
    • 2012-07-11
    • 2016-01-28
    • 1970-01-01
    • 2023-03-13
    • 2012-11-15
    • 1970-01-01
    相关资源
    最近更新 更多