ZeroMQ高水位标记(high-water mark,HWM)

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实现其队列的方式。

原文地址:https://www.cnblogs.com/kohlrabi/p/7306587.html