设置高水位的方法为设置zeromq配置项的通用方法(zmq_setsockopt),只是设置的变量根据传入的标识值改变,利用socket_base_t类中的setsockopt方法来设置。socket_base_t方法中有从own_t类中继承的option_t类型的成员变量。option_t类中有发送高水位及接收高水位的成员变量。
高水位的默认值设置为1000,单位为消息个数
一般来讲,pubsub模式的高水位不用设置基本能够满足需求。
如果设置conflate(合并)字段,套接字会忽略高水位设置。
低水位设置要求:
低水位必须低于高水位
低水位的值不能为很低的值如0,因为填充消息队列后只有消息被读取后再次填充,所有没有必要报酬后方进度。
低水位不能够设置特别高,如(hwm-1)因为消息被读取一个后就会允许重新写入,然后写入一个后继续休眠。效率很低。
如果高水位>1024*2,
低水位=高水位-1024,
否则:
低水位= 高水位的一半
非阻塞的类型(或组播)才可以使用高水位
在一个发布端多个订阅端的情况下,发送性能会下降,水位限制的压力会减小(因为一个连接一个水位限制),内存使用率会增加。
各种套接字水位设置区别:
对于inproc类型的套接字,因为不牵扯到IO线程,所以设置过程如下:
1.在设置bind类型套接字时,检查是否有已经连接到该地址的连接,如果有则连接到绑定的套接字上。此时,将连接端的发送发送高水位和对端的接收高水位