我可能会误解这一点,但似乎在响应者收到请求时使用ROUTER/DEALER
模式zmq
时,它必须按原路返回。
让回复者直接响应远程请求者似乎会减少网络延迟。
有没有办法做到这一点,也许通过传递物理地址而不是id
?
有可能创建这样的系统吗?
我想看到一个像这样的传输链REQ
-> ROUTER
-> DEALER
-> REP
-> REQ
,其中的两个出现REQ
代表同一台机器
我可能会误解这一点,但似乎在响应者收到请求时使用ROUTER/DEALER
模式zmq
时,它必须按原路返回。
让回复者直接响应远程请求者似乎会减少网络延迟。
有没有办法做到这一点,也许通过传递物理地址而不是id
?
有可能创建这样的系统吗?
我想看到一个像这样的传输链REQ
-> ROUTER
-> DEALER
-> REP
-> REQ
,其中的两个出现REQ
代表同一台机器
您可以在这里做您想要做的事情,至少在某种程度上......但不要过度滥用系统以使其以非预期的方式运行,否则您将为自己制造维护噩梦。在这种情况下,“太远”的位置会因开发团队和项目而异,但请记住这一点。
以下是您提出的模式会遇到问题的几个原因:
bind()
打开)或客户端套接字(您将connect()
打开)。在您提出的模式中,它之所以有效,是因为套接字的总数是偶数,但是如果您要在链中添加或删除一个套接字,您将遇到以下情况:-
SOCKET A -> SOCKET B -> SOCKET C -> (SOCKET A)
CLIENT SERVER CLIENT ( CLIENT )
CONNECT BIND CONNECT ( CONNECT)
s的套接字connect()
无法连接到connect()
s 的另一个套接字。与两个插座相同bind()
。
...这是我的建议:
如果你想让你提议的消息传递模式工作,你需要向它添加套接字。每个进程都应该拥有一个传入和传出套接字(这将确保始终有偶数个套接字,并且bind()
ing 和connect()
ing 应该是可管理的。您将能够为每种套接字类型维护适当的消息传递(不会破坏 REQ 和 REP 的期望) ) 通过添加另一个套接字来接收另一半的通信。但实际上,您应该查看现有协议并确定它们对您不起作用,并首先确定原因。
ZeroMQ 可以毫无问题地传递封装在消息有效负载中的任何节点的物理地址,但是有一些原因,为什么这并没有像它可能看起来那么简单直接地解决您的愿望。
ZeroMQ 是一个强大的智能、可扩展、正式模式的框架,用户在此框架上构建她/他自己的消息传递系统。因此,使用正式模式(类似PUB/SUB
或REQ/REP
)意味着您完全重用了它们的硬连线属性(它们的行为),而不仅仅是一半或三分之一。理解行为将使您能够构建您计划开发的更高层的功能,但没有人可以(应该)损害 ZeroMQ 库原语 == 构建块的行为模型。它会破坏你的构建块的稳定性,所以宁愿在顶部集成任何新的更智能的附加功能” 的功能齐全的原始关系,而不是试图以失去框架强度和稳健性为代价来破解/走私东西。
ZeroMQ 原语可以同时通过几个“传输类”连接到它的对方,这个事实对应用程序逻辑是绝对透明的。这意味着,如果您的想法始于inproc:
“已连接” REQ
,那么您的地址传递/路由将无法在远端工作,其中REP
节点没有到始发者的这种传输类兼容路径,并且地址要么碰巧碰巧,要么一旦它在远程端不存在就无用,因此更快/更简单的答案路由的预期好处是请求者(此时跳过配对合作对等方之间缺少“握手”的麻烦,一旦路由将跳过/绕过中间节点的轨迹段,从而让它们等待响应,那将永远不会出现...... )
在我看来,你可以做的最好的下一步是获得更多的全局视图,这对于尝试使用 ZeroMQ 编码的前几件事来说可能听起来很复杂,但如果你至少跳到第265 页连接代码,第 1 卷,如果不是在那里逐步阅读的情况。
有史以来最快的学习曲线是首先对Fig.60 Republishing Updates和Fig.62 HA 克隆服务器对有一个未公开的视图,以获得可能的高可用性方法,然后回到根源、元素和细节.