use*_*171 9 publish-subscribe zeromq
我对ZeroMQ PUB/SUB进行了快速测试,现在有一些工作代码.但是,我对zeromq中应用的高水印概念感到有点困惑.
我在我的发布者代码中设置了一个HWM,它为连接到套接字的每个订阅者设置队列长度.
但是,也可以在用户的接收套接字上设置HWM.是否有任何理由在订户端设置HWM,这与设置发布者HWM有何不同?
Fra*_*ini 25
在发布者中,我们应该总是仔细考虑HWM,因为有很多理由崩溃(内存不足)影响整个系统(因为发布者为所有订阅者提供服务).
同样在订户中,存在调节HWM可能有用的情况,但这主要取决于订户的性质,它对接收的消息的作用以及它无法处理的概率有多高.收到大量信息的时间; 以及预期的运行时环境(可用内存量,订户数等)
ZMQ使用HWM(高水位标记)的概念来定义其内部管道的容量.从套接字或套接字出来的每个连接都有自己的管道,HWM用于发送和/或接收,具体取决于套接字类型.某些套接字(PUB,PUSH)只有发送缓冲区.有些(SUB,PULL,REQ,REP)只有接收缓冲区.有些(DEALER,ROUTER,PAIR)必须同时发送和接收缓冲区.
可用的套接字选项是:
ZMQ 3.0+强制对其内部缓冲区(即所谓的HWM)进行默认限制,因为HWM是减少内存溢出问题的好方法
双方ZMQ_PUB并ZMQ_SUB有ZMQ_HWM选择的动作设定为"下降",因此,当极限富化订户或出版商的内存应该停止成长,至少由什么决定由ZMQ缓冲区.
通常谁需要最大程度的防止不加区别地使用内存(内存不足问题)的是出版商:
在inproc传输中,发送方和接收方共享相同的缓冲区,因此实际HWM是双方设置的HWM的总和.
但是如果您使用TCP并且订阅者很慢,则消息将在发布者上排队.
常见故障原因PUB-SUB包括:
通过在发布者上排队消息会使发布者内存不足并崩溃,特别是如果有大量订阅者,并且出于性能原因无法刷新到磁盘.
从发布者的角度来看,我们通过正确设置ZWM使用的伟大策略是停止在一段时间后对新消息进行排队,新消息被拒绝或丢弃; 这是ØMQ在发布商设置HWM时所做的事情.
ZMQ还可以在订户上对消息进行排队
如果有人会耗尽内存并崩溃,那么它将是订阅者而不是发布者,这是公平的.这对于"高峰"流是完美的,其中订户不能保持一段时间,但是当流减慢时可以赶上.
注意:HWM不准确; 虽然默认情况下你最多可以获得1,000条消息,但由于libzmq实现其队列的方式,实际缓冲区大小可能会低得多(只有一半).
这些假设的主要来源是Pieter Hintjens的书"Code Connected Volume 1",该书以电子格式在线提供; 它有一章致力于高水印,包含有关该主题的更多解释.
| 归档时间: |
|
| 查看次数: |
8783 次 |
| 最近记录: |