0

我可能会误解这一点,但似乎在响应者收到请求时使用ROUTER/DEALER模式zmq时,它必须按原路返回。

让回复者直接响应远程请求者似乎会减少网络延迟。

有没有办法做到这一点,也许通过传递物理地址而不是id

有可能创建这样的系统吗?

我想看到一个像这样的传输链REQ-> ROUTER-> DEALER-> REP-> REQ,其中的两个出现REQ代表同一台机器

4

2 回答 2

1

可以在这里做您想要做的事情,至少在某种程度上......但不要过度滥用系统以使其以非预期的方式运行,否则您将为自己制造维护噩梦。在这种情况下,“太远”的位置会因开发团队和项目而异,但请记住这一点。

以下是您提出的模式会遇到问题的几个原因:

  • 您的 DEALER 套接字与其他两个套接字对等。DEALER 套接字以循环方式发送数据,因此它将向您的 REP 套接字发送一条消息,下一条将返回您的 ROUTER 套接字。可能不是你想要的。
  • 没有明确的服务器套接字(您将bind()打开)或客户端套接字(您将connect()打开)。在您提出的模式中,它之所以有效,是因为套接字的总数是偶数,但是如果您要在链中添加或删除一个套接字,您将遇到以下情况:

-

SOCKET A  ->  SOCKET B  ->  SOCKET C  ->  (SOCKET A)
CLIENT        SERVER        CLIENT        ( CLIENT )
CONNECT       BIND          CONNECT       ( CONNECT)

s的套接字connect()无法连接到connect()s 的另一个套接字。与两个插座相同bind()

  • 您试图打破这样的观念,即 REQ 套接字期望来自它发送请求的套接字的回复,而 REP 套接字回复向它发送请求的套接字。如果这是可能的(我还没有研究过),那将是的“太远”和“预计维护头痛”的路线。

...这是我的建议:

  • 如果您没有或没有,请阅读指南
  • 消息传递协议很难。看起来他们应该很容易,但他们很容易做错事。这就是为什么使用现成的协议可能是一个好主意的原因,即使它对您来说似乎效率较低。
  • 不要过早优化。奇怪的是,额外的网络延迟不会成为您的瓶颈。你真正传递了多少数据?有没有办法可以卸载大部分数据?例如,如果您要为每条消息发送 MB 数据,您能否将其存储在可集中访问的存储库中,然后只在您的消息中发送 URI?
  • 指南中列出了许多消息传递协议,并在 ZMQ 资源站点上免费提供。它们经过测试和精心设计。除非它们对您不起作用,否则请尝试使用它们。

如果你想让你提议的消息传递模式工作,你需要向它添加套接字。每个进程都应该拥有一个传入和传出套接字(这将确保始终有偶数个套接字,并且bind()ing 和connect()ing 应该是可管理的。您将能够为每种套接字类型维护适当的消息传递(不会破坏 REQ 和 REP 的期望) ) 通过添加另一个套接字来接收另一半的通信。但实际上,您应该查看现有协议并确定它们对您不起作用,并首先确定原因。

于 2014-10-24T14:39:28.210 回答
0

是的,是的,但是在一个其他合乎逻辑的问题中几乎没有警告

ZeroMQ 可以毫无问题地传递封装在消息有效负载中的任何节点的物理地址,但是有一些原因,为什么这并没有像它可能看起来那么简单直接地解决您的愿望。

  1. ZeroMQ 是一个强大的智能、可扩展、正式模式的框架,用户在此框架上构建她/他自己的消息传递系统。因此,使用正式模式(类似PUB/SUBREQ/REP)意味着您完全重用了它们的硬连线属性(它们的行为),而不仅仅是一半或三分之一。理解行为将使您能够构建您计划开发的更高层的功能,但没有人可以(应该)损害 ZeroMQ 库原语 == 构建块的行为模型。它会破坏你的构建块的稳定性,所以宁愿在顶部集成任何新的更智能的附加功能” 的功能齐全的原始关系,而不是试图以失去框架强度和稳健性为代价来破解/走私东西。

  2. ZeroMQ 原语可以同时通过几个“传输类”连接到它的对方,这个事实对应用程序逻辑是绝对透明的。这意味着,如果您的想法始于inproc:“已连接” REQ,那么您的地址传递/路由将无法在远端工作,其中REP节点没有到始发者的这种传输类兼容路径,并且地址要么碰巧碰巧,要么一旦它在远程端不存在就无用,因此更快/更简单的答案路由的预期好处是请求者(此时跳过配对合作对等方之间缺少“握手”的麻烦,一旦路由将跳过/绕过中间节点的轨迹段,从而让它们等待响应,那将永远不会出现...... )

去哪里了解更多详情?

在我看来,你可以做的最好的下一步是获得更多的全局视图,这对于尝试使用 ZeroMQ 编码的前几件事来说可能听起来很复杂,但如果你至少跳到第265 页连接代码,第 1 卷,如果不是在那里逐步阅读的情况。

有史以来最快的学习曲线是首先对Fig.60 Republishing UpdatesFig.62 HA 克隆服务器对有一个未公开的视图,以获得可能的高可用性方法,然后回到根源、元素和细节.

在此处输入图像描述

于 2014-10-24T10:22:23.043 回答