在 RocketMQ 中,虽然消息先存放在内存中,在刷到硬盘中。但又可能消息已经落在了 硬盘中,导致了消费端去硬盘中中拉取消息,造就了 IO 过高的现象。但又一个几个参数我们是可以做调整的。参数列表如下:
当然啦。这几个参数的值我们是可以调整的。但我觉得,还是默认比较好。
但这几个参数的相关使用在哪里呢?请看下面的截图:
注意啦!在 rocketmq 中,offset 增加 1 ,就表示 增加一个字节;可能有的小伙伴对 checkInDiskByCommitOffset 这个函数理解的不是很明白,看一下的截图:
;
这里使用到的是,和 物理内存进行做比较的。不能使用到虚拟内存的。因为虚拟内存还是硬盘的一块区域。
如果有很多消息都落在硬盘上了,那么,master broker 会返回一个参数 slave broker id (默认值是 1,可以配置的哦),建议去 slave broker id 中拉取数据。请看下图:
。其中
,private long whichBrokerWhenConsumeSlowly = 1 ;这个属性是可以配置。这里的 1 表示 slave broker 的 id。
客户端的代码比较简单,就不贴出来了。
在客户端拉取消息的时候,会通过 mq 拿到 broker 的地址的。如果没有 slave 的话,最终还是去 master broker 拉取消息,只是速度慢了点罢了。