首先,欢迎来到零之禅的世界,延迟最重要
序言:
ZeroMQ 是由 Pieter HINTJENS 的最终经验丰富的大师团队设计的——Martin SUSTRIK 被命名为第一名。该设计经过专业设计,以避免任何不必要的延迟。那么询问是否具有(有限的)持久性?不,先生,未确认 - PUB/SUB
Scalable Formal Communication Pattern Archetype 不会内置它,因为增加了问题以及降低了性能和可扩展性(附加延迟、附加处理、附加内存管理)。
如果需要(有限的)持久性(对于缺少远程 SUB 端代理的连接),请随时在应用程序端实现它,或者可以设计和实现一种新的 ZMTP 兼容的此类行为模式Archetype,扩展 ZeroMQ 框架,如果这样的工作进入稳定和公众接受的状态,但不要求高性能、延迟削减的标准PUB/SUB
已经完善了几乎线性的可扩展性 ad astra,在这个方向上进行修改。这绝对不是一条路。
解决方案 ?
应用程序端可以轻松实现您添加的逻辑,使用双指针循环缓冲区,在某种(应用程序端管理的) - Persistence-PROXY中工作,但在PUB
-sender 的前面。
您的设计可能会成功地从 ZeroMQ 内部细节中榨取一些额外的调味汁,以防您的设计也喜欢使用最近提供的内置 ZeroMQ--组件socket_monitor
来设置额外的控制层并在那里接收事件流来自 PUB 端实例的“内部” ,其中一些额外的网络和连接管理相关事件可能会为您的(应用端管理的)Context
带来更多亮点- Persistence-PROXY
然而,请注意
该_zmq_socket_monitor()_
方法仅支持面向连接的传输,即 TCP、IPC 和 TIPC。
所以人们可能会直接忘记这一点,以防计划使用任何最终有趣的传输类{ inproc:// | norm:// | pgm:// | epgm:// | vmci:// }
小心 !
我们的社区尊敬的成员smac89提供了不准确的信息(如果没有错的话),他已尽力解决您在评论中表达的额外兴趣:
“...zmq 优化主题发布?例如,如果您继续快速发布大约 100char 长topic
,它实际上是topic
每次发送还是映射到某个 int 并随后发送 int...?”
告诉你:
“它总是会发布topic.
当我使用该pub-sub
模式时,我通常发布topic
第一条然后是实际消息,所以在订阅者中我只是读取第一帧并忽略它然后读取实际消息”
ZeroMQ 不能以这种方式工作。没有什么作为“单独”<topic>
后跟 a <message-body>
,而是相反
主题过滤的TOPIC
机械化以非常不同的方式工作。
1)你永远不知道,谁.connect()
-s:
即几乎可以肯定版本 2.x 直到版本 4.2+ 将以不同的方式处理主题过滤( ZMTP:RFC 定义了初始能力版本握手,让Context
-instance决定,必须使用哪个版本的主题过滤:
ver 2.x用于将所有消息移动到所有对等点,并让所有 SUB 端(ver 2.x+)传递消息(并让SUB
- side Context
-instance 处理本地topic
-list 过滤处理)
,而
4.2+ 版topic
肯定会在 ** PUB 端执行-list 过滤处理Context
-instance (CPU 使用率增长,网络传输相反),因此您的 SUB 端将永远不会收到一个字节“无用”读取“未订阅”消息。
2)(你可以,但是)没有必要将“主题”分离成这样隐含的多帧消息的第一帧。也许恰恰相反(在高性能、低延迟的分布式系统设计中这样做是一种相当反模式。
主题过滤过程被定义并按字节方式工作,从左到右,将每个主题列表成员值与传递的消息有效负载进行模式匹配。
添加额外的数据、额外的帧管理处理只会增加端到端延迟和处理开销。这样做不是一个好主意,而不是适当的分布式系统设计工作。
结语:
专业的分布式系统设计没有容易的胜利,也没有任何容易实现的成果,低延迟或超低延迟是设计目标。
另一方面,确保 ZeroMQ 框架是考虑到这一点的,并且这些努力得到了稳定、最终性能良好且平衡的工具集,用于智能(按设计)、快速(运行中)和可扩展(如地狱可能羡慕)由于这种设计智慧,人们喜欢正确使用的信号/消息服务。
希望您对 ZeroMQ 感到满意,并随时在您选择的应用程序套件中的 ZeroMQ 层“前面”添加任何额外的功能集。