如何针对这种情况使用 ZeroMQ 设计结构

how to design a structure with ZeroMQ for this case

这是我的计划:
我有很多代理和一个代理经理。
如果代理运行,它会连接代理管理器说:我是代理。
代理管理器可以控制所有 运行 个代理。例如,代理经理可以说:代理 1,请做点什么。这是一个例子:

*****************                       *********
* 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,但它似乎行不通。因为事情是这样发生的:请求---回复---回复---请求---回复---请求...

此外,我们可能有不止一位代理人。这意味着代理管理器可以同时控制多个代理。所以想用多线程,老板不同意。他现在想使用单线程。所以我想我应该使用 "non-blocking" 模式。

那么我如何为这种情况设计非阻塞的 0MQ 模式?

使用Dealer(Agent)/Router(Agent Manager)。它们将替代 REQ/REP,因为它们或多或少是相同的,只是具有非结构化的通信模式。作为通信的一部分,您的代理管理器将在消息的第一帧中接收每个代理的 ID。它将需要跟踪这些 ID,以便它可以启动与它们的通信。在 ZMQ guide which you should definitely read if you have not. Specifically, take a look at 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"])

...等等。我故意交错消息响应只是为了演示它如何处理需要不同时间的更复杂的作业。 ID 以您可以访问的方式被 ROUTER 接收、由 ROUTER 发送但被 DEALER 剥离的方式是这些套接字类型的操作方式所固有的。您只需要跟踪这些 ID,了解正在使用哪些 ID,并且在您收到回复之前只发送给尚未找到工作的 ID。