消息实体的存储
待添加…
消息位置的存储
消息在commitLog的putMessage方法,一直到最后的doAppend方法将消息实体写到了最新的一个MappedFile里,然后根据用户不同的配置进行同步刷盘或者异步刷盘,异步刷盘就是有一个单独的刷盘线程去完成的。
那消息位置信息怎么存呢?
众所周知,消息实体存在于commitLog这一个逻辑文件里,而某个queue拥有哪些消息这个信息,是存在于这个queue自身的名叫consumeQueueFile的逻辑文件里的。
这里涉及到两个服务,ReputMessageService和FlushConsumeQueueService,他俩都是两个线程,ReputMessageService凭借重放消息,将消息的位置信息写到对应queue的位置信息文件的pageCache里去。
FlushConsumeQueueService负责将ReputMessageService写到pageCache的数据通过调用force方法刷盘。
ReputMessageService的主要逻辑:
- 拿到当前最大重放位置
- 继续重放消息
- 拿到消息的bytes
- 检查并解析拿到一些关键信息,比如queueId、queueOffset、topic等
- 根据topic和queueId查找到对应的queue
- 从存储当前queue消息位置信息的mappedFileQueue中拿到最后一个MappedFile文件
- 将位置信息数据写到这个MappedFile中
FlushConsumeQueueService的主要就是遍历所有topic的所有queue,根据各自上次刷新位点调用force方法对文件刷盘。
附