rocketmq:4.3.2
测试环境一个小集群:2m, 2s
1.writeQueueNum使用的地方
rocketmq的 CommitLog的消息的写入格式,其中一项就包括queueId,这个时候的queueId是发送端上报上来的writeQueueNum.
具体写入的实现类是CommitLog类里面的DefaultAppendMessageCallback.doAppend方法。
2.生成consumeQueue和index文件
位置在DefaultMessageStore类里面,它会启动一个ReputMessageService类, 它的逻辑会触发消息转发,即从CommitLog里转写如consumeQueue和index文件,具体的实现类是 CommitLogDispatcherBuildConsumeQueue,CommitLogDispatcherBuildIndex。
3.第一次生成consumeQueue文件的逻辑
去这个类:CommitLogDispatcherBuildConsumeQueue 追代码,最终到findConsumeQueue方法.
public ConsumeQueue findConsumeQueue(String topic, int queueId) {
ConcurrentMap<Integer, ConsumeQueue> map = consumeQueueTable.get(topic);
if (null == map) {
ConcurrentMap<Integer, ConsumeQueue> newMap = new ConcurrentHashMap<Integer, ConsumeQueue>(128);
ConcurrentMap<Integer, ConsumeQueue> oldMap = consumeQueueTable.putIfAbsent(topic, newMap);
if (oldMap != null) {
map = oldMap;
} else {
map = newMap;
}
}
ConsumeQueue logic = map.get(queueId);
if (null == logic) {
ConsumeQueue newLogic = new ConsumeQueue(
topic,
queueId,
StorePathConfigHelper.getStorePathConsumeQueue(this.messageStoreConfig.getStorePathRootDir()),
this.getMessageStoreConfig().getMapedFileSizeConsumeQueue(),
this);
ConsumeQueue oldLogic = map.putIfAbsent(queueId, newLogic);
if (oldLogic != null) {
logic = oldLogic;
} else {
logic = newLogic;
}
}
return logic;
}
根据queueId从map里面获取ConsumeQueue对象的时候,这个queueId是writeQueueNum的值。即具体创建的consumeQueue文件的数量是根据配置的writeQueueNum决定的。 readQueueNum无用。
验证:
case-1:
topic: topic_store_test3, writeQueueNum=4, readQueueNum=2
随机发送20个消息, 观察/data/store-a-m/consumequeue/topic_store_test3/ 文件夹下面的文件数量, 为4个。
case-2:
topic:topic_store_test4, writeQueueNum=2, readQueueNum=4
随机发送20个消息, 观察/data/store-a-m/consumequeue/topic_store_test4/ 文件夹下面的文件数量, 为2个。
即consumeQueue的文件的数量由writeQueueNum控制。