ZeroMQ 能否为双向非阻塞异步传输提供依据?

Can ZeroMQ provide grounds for a bidirectional non-blocking asynchronous transmission?

我有一个由两个应用程序组成的系统。目前,两个应用程序使用为每种特定传输类型生成的多个 ZeroMQ PUB/SUB 模式进行通信。套接字是用 C 编写的。

例如,AppX 使用 SUB 正式套接字原型来接收信息 struct来自 AppY 并使用另一个 PUB 正式套接字原型将原始位块传输到 AppY 同样适​​用于 AppY。它使用 PUB/SUB 模式进行传输和接收。

要明确 AppX 和 AppY 执行以下通信:

AppX -> AppY :
- 1 kbits(连续)的原始位块,
-整数命令(不连续,取决于用户)

AppY -> AppX :
信息 struct 10kbits(连续)


设计目标:

a)我的目标是每侧仅使用一个套接字以非阻塞模式进行双向通信。
b) 我希望两个应用程序在没有过多延迟的情况下处理排队接收的数据包。
c) 我不希望 AppX 在 AppY 崩溃后崩溃。


Q1: ZeroMQ 可以吗?
Q2: 我可以使用 ROUTER/DEALER 或任何其他模式来完成这项工作吗?

我已经阅读了指南,但我无法弄清楚某些方面。

其实我对ZeroMQ不是很有经验。我很高兴听到有关此问题的其他提示。

A1: 是的,这在 ZeroMQnanomsg 类工具中是可能的

ZeroMQ 和它的妹妹 nanomsg 都拥有
Scaleable 的愿景(您还没有强调)
Formal(硬连线的正式行为)
Communication(是的,就是这个)
图案(精心雕琢,可根据需要重复使用和组合)

这就是说,如果您更喜欢在每个 "side" 上只有一个套接字模式,那么您必须选择这样一种正式模式,这样您就可以摆脱任何硬连线行为,从而实现您的目标。

所以,a) "...只有一个" 是可行的 -- 通过 [ 的独奏=15=](文档的某些部分将其标记为仍然是实验设备)或 NN.BUS 或一对 PUSH/PULL 如果您退后一步,不再只允许一个(这实际上消除了共享 zmq.Context() 实例化 IO 线程以重新使用低级 IO 引擎的所有强大功能。如果你花几分钟看下面提到的例子,你很快就会意识到,当一个人在系统架构中使用更多甚至更多的模式时,相反的策略很常见并且对设计目标有益。

a) "...non-blocking" 是可行的,通过为各自声明适当的指令 zmq.NOBLOCK .send() / .recv() 函数并在您的应用程序设计架构中使用快速、非阻塞 .poll() 循环。

关于 b) “...没有...延迟” 与关于应用程序设计架构的非常著名的评论有关,因为你可能仅仅依靠一个糟糕的选择就失去了它 and/or 不可能调整事件处理程序的内部时间和延迟惩罚。如果你仔细塑造你的设计,你可能会完全控制你的系统将经历的 delay/latency 而不是成为任何框架的黑盒事件循环的受害者,在那里你只能等待它的惊喜繁重的系统或流量负载。

c) "... Y 崩溃后 X 崩溃"{ ZeroMQ | nanomsg }- 的基础上是可行的,通过所有功能的非阻塞模式的精心组合 + 通过您的设计能够在它没有从预期的 { local | remote }- 功能中收到任何 POS_ACK 的情况下处理异常。在这方面,可以公平地说,一些 F 正常 C 通信 P由于某种强制性的内部行为,即在内部 "hard wired",atters 没有这种灵活性,因此在选择适当的 FCP 时要格外小心- 每个此类仍可扩展但具有故障恢复能力的角色的原型。


Q2:没有


最好的下一步:

您可能会对 other ZeroMQ posts here and also do not miss the link to the book, referred there >>>

感兴趣

Q1:
Q2: 不,AppX 和 AppY[=20 都应该使用 ZMQ_DEALER =]. 参见 http://zguide.zeromq.org/c:asyncsrv。请注意,此示例中的 ZMQ_ROUTER 只是旨在将请求从多客户端分发到不同的线程,其中 ZMQ_DEALER 执行实际工作。