1.设置 SuggestPullingFromSlave 的值
剩余未拉取消息的内存大小超过了允许使用的最大内存阔值(物理内存的 40%)
本次拉取消息时,判断未拉取的消息大小是否超过了物理内存的 40%,如果超过了,就建议去 Slave 拉取消息。
从另一个方面说,未拉取的消息太多了,多到已经超过了内存能容纳的值,这种情况下拉取消息就可能需要读取磁盘上文件的数据,性能会比较差,所以,建议从 Slave 拉取。
// diff: 剩余未拉取消息的大小
// memory: 消息使用物理内存的最大比例,默认为 40%,
// 即 RocketMQ 在内存中的消息最大占用物理内存的 40%
setSuggestPullingFromSlave(diff > memory);
2.使用 SuggestPullingFromSlave 的值
SuggestPullingFromSlave == true 前提下,判断拉取消息的 Broker 判断逻辑顺序:
- 发现消息堆积超过物理内存的 40%,则下次建议使用 brokerID = getWhichBrokerWhenConsumeSlowly() 的 Broker 去读消息
- 如果当前 Broker 角色是 Slave,且 slaveReadEnable=false,则下次直接去 Master 拉消息
- 如果 slaveReadEnable=true,则下次建议使用 brokerID = getWhichBrokerWhenConsumeSlowly() 的 Broker 去读消息,否则,则使用订阅组建议的 Broker 读消息
- 其它情况使用 Master 读取消息