这是我的计划:
我有很多代理商和一个代理经理
如果代理运行,它将连接代理管理器说:我是代理。
代理管理器可以控制所有正在运行的代理。例如,代理管理器可以说: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,但它似乎不会起作用。因为事情是这样发生的:请求---回复---回复---请求---回复---请求......
此外,我们可能有多个代理商。这意味着代理管理器可以同时控制多个代理。所以我想使用多线程,但我的老板并不同意。他现在想要使用单线程。所以我认为我应该使用&#34;非阻塞&#34;模式。
那么如何用非阻塞设计这种情况的0MQ模式呢?
答案 0 :(得分: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,知道正在使用哪些ID,并且只有在收到回复之前才发送给那些尚未找到工作的ID。