如何在这种情况下使用ZeroMQ设计结构

这是我的计划:
我有很多代理和一位代理经理。
如果一个代理运行,它将连接代理经理说:我是代理。
代理管理器可以控制所有运行代理。 例如,代理经理可以说:agent1,plz做某事。 这里是一个例子:

*****************                       *********
* agent manager * <-----I'm agent1----- * Agent *
*               * ---------OK---------> *       *
*               *                       *       *
*               * ---calculate 1+1----> *       *
*               * <-------It's 2------- *       *
*               * -------go sleep-----> *       *
*               * <--OK, I'm sleeping-- *       *
*               * ------wake up-------> *       *
*               * <---------OK--------- *       *
*               * ---calculate 1+2----> *       *
*               * <-------It's 3------- *       * 
*****************          ...          *********

我正在考虑使用REQ / REP,但它似乎不起作用。 因为事情发生像这样:请求---回复---回复---请求---回复---请求...

此外,我们可能有不止一个代理商。 这意味着代理经理可以同时控制许多代理。 所以我想用多线程,但我的老板不同意。 他现在想要使用单线程。 所以我认为我应该使用“非阻塞”模式。

那么,我怎么能设计一个0MQ模式的这种情况与非阻塞?


使用经销商(代理商)/路由器(代理商经理)。 它们将会替代REQ / REP,因为它们或多或少是相同的,只是具有非结构化的通信模式。 您的代理管理器将在消息的第一帧中收到每个代理的ID作为通信的一部分。 它需要跟踪这些ID,以便它可以启动与他们的通信。 有些例子说明了如何在ZMQ指南中起作用,如果你还没有,你应该读一读。 具体来说,看看这个部分看看它是如何工作的。 快速图表:

DEALER1-setID('agent1')                        ROUTER-bind()
DEALER1-connect()-------------------------------->  *
DEALER1-send("I'm agent1")-------------->  ROUTER-recv(['agent1', "I'm agent1"])
DEALER1-recv('OK')  <----------------------ROUTER-send(['agent1', 'OK'])



DEALER2-setID('agent2')
DEALER2-connect()-------------------------------->  *
DEALER2-send("I'm agent2")-------------->  ROUTER-recv(['agent2', "I'm agent2"])
DEALER2-recv('OK')  <----------------------ROUTER-send(['agent2', 'OK'])


DEALER1-recv('calc 1+1')  <----------------ROUTER-send(['agent1', 'calc 1+1'])
DEALER2-recv('calc 1+2')  <----------------ROUTER-send(['agent2', 'calc 1+2'])

DEALER1-send("It's 2")------------------>  ROUTER-recv(['agent1', "It's 2"])
DEALER1-recv('go sleep')  <----------------ROUTER-send(['agent1', 'go sleep'])
DEALER2-send("It's 3")------------------>  ROUTER-recv(['agent2', "It's 3"])
DEALER1-send("OK, I'm sleeping")-------->  ROUTER-recv(['agent1', "OK, I'm sleeping"])

... 等等。 我故意插入了消息响应,只是为了演示它如何处理需要花费不同时间的更复杂的作业。 ROUTER以一种您可以访问的方式接收ID,并由ROUTER发送但由DEALER剥离的方式与这些套接字类型的操作方式有关。 你只需要跟踪这些ID,知道哪些正在使用,并只发送给那些还没有工作的人,直到你收到回复。

链接地址: http://www.djcxy.com/p/18379.html

上一篇: how to design a structure with ZeroMQ for this case

下一篇: ZeroMQ: How to send messages to a specific subscriber