ZMQ使用高水位标记(HWM)的概念来定义其内部管道的容量。每个连接都有其发送或接受数据的管道和对应的HWM。对于管道和HWM,不同的socket有不同的行为:
- PUB,PUSH只有发送管道(buffer?)
- SUB,PULL,REP,REQ只有接受管道
- DEALER, ROUTER, PAIR两者都有
在ZMQ2.x版本中,HWM默认是没有限制的。在3.x版本中,HWM默认值为1000。在新版本中HWM宏已经被替换:
# define ZMQ_SNDHWM ZMQ_HWM
# define ZMQ_RCVHWM ZMQ_HWM
可以通过setsocketopt函数来设置HWM的值。
当数据填满管道,达到HWM时,不同的socket也有不同的表现:
- PUB 和 ROUTER 会丢弃数据
- 其他的socket会阻塞
- 这里的socket作为发送端
- 如果连接没有建立,在填满本地缓存后,阻塞或丢弃数据
- 如果建立了连接,在填满本地和对端缓存后,阻塞或丢弃数据
最后,HWMs并不准确; 默认情况下,最多可以收到1000条消息,实际的缓冲区大小可能要低得多(少至一半),这取决于libzmq实现其队列的方式。