RocketMQ 消费队列的写入跟commit log的写入是否同步进行的
消费队列的写入跟commit log的写入是同步进行的吗?答案是否定的,RocketMQ会启动一个独立的线程来异步构建消费队列(构建索引文件也是这个线程)
简单描述下流程:构建索引的线程为ReputMessageService
,跟写入commitLog的线程是异步关系,该线程会不断地将没有构建索引的消息从commit log中取出,将物理偏移量、消息长度、tag写入文件。值得一提的是,消息队列文件的写入跟commit log不同,commit log的写入有很多刷盘策略,而consumeQueue每条消息解析完毕都会刷盘,而且采用的是FileChannel
Broker收到消息的流程:Broker收到一条消息后,先把消息存储在CommitLog中,之后把CommitLog中对应的物理地址(文件偏移量),记录在对应的MessageQueue对应的的ConsumeQueue文件中