2015-09-28 84 views
0

这里是我的计划:
我有很多代理和一个代理管理器。
如果一个代理运行,它将连接代理管理员说:我是代理。
代理管理器可以控制所有运行代理。例如,代理经理可以说:agent1,plz做某事。这里有一个例子:
如何在这种情况下使用ZeroMQ设计结构

*****************      ********* 
* 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模式的这种情况与非阻塞?

回答

2

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

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,知道哪些正在使用,并只发送给那些还没有工作的人,直到你收到回复。