RocketMQ---消息存储

1.消息存储的原理如下:

RocketMQ---消息存储

1.1 CommitLog

1.消息存储文件,所有消息主题都存储到CommitLog中;

2.commitLog每个大小为1G,方便做内存映射;

3.commitLog的文件名为为该文件第一条消息的物理偏移量。

1.2 ConsumeQueue

1.消息消费队列:消息到达CommitLog后,将异步发送给消息消费队列供消费者消费(根据偏移量查找消息,从偏移量读取size长度的内容)。

2.不存全量消息

1.3 IndexFile

1.消息索引文件,主要存消息Key与Offset的对应关系。

2.消息消费队列与索引文件的更新

RocketMQ通过开启一个线程ReputMessageService来准时转发CommitLog文件更新事件,相应的任务处理器根据转发的消息及时更新consumeQueue与indexFile文件。

3.消息消费队列与索引文件恢复

如果消息成功存储到CommitLog中,转发任务未成功执行,Broker宕机,将导致CommitLog,ConsumeQueue,IndexFile文件数据不一致。

故障恢复:存在abort文件,说明broker非正常关闭,会从最后一个文件找起,找到第一个存储正常的文件。

4.过期文件删除机制

CommitLog与ConsumeQueue采用的是顺序写,所有写操作都落在最后一个文件上,之前的文件将不会被更新;

文件默认72个小时内没被更新过则为过期文件。