RocketMQ的消息存储是一个负责的过程,设置上充分考虑了性能和扩展性。消息存储的主要组件包括CommitLog 文件、消费队列文件(ConsumeQueue)、以及索引文件(IndexFile)。
CommitLog文件
CommitLog 是 RocketMQ 的核心存储文件,负责保存消息的完整内容。
- 顺序写入:所有的消息都顺序写入 CommitLog 文件,这种方式减少了磁盘寻道时间,提高了写入性能那个。
- 文件滚动:CommitLog 按照固定大小(1GB)进行分片。当一个文件写满后,会创建一个新文件。
- 存储所有数据:包括消息体、主题、队列 ID 等。
ConsumeQueue 文件
ConsumeQueue 是针对消息的逻辑视图,目的是加快消费者对消息的访问速度
- 条目固定:每个 ConsumQueue 条目固定文 20字节,包含消息在 CommitLog 中的偏移量、消息大小、Tag 哈希值。
- 独立文件:每个主题的每个队列都有独立的 ConsumeQueue 文件,文件路径为
store/consumequeue/{topic}/{queueId}
- 快速定位:通过 ConsumeQueue,消费者无需扫描整个 CommitLog 即可快速找到消息的位置。
IndexFile文件
IndexFile 用于支持消息的快速检索
- 哈希索引:为消息的 key 建立哈希索引,支持通过 key 快速检索消息偏移量
- 增强查询:IndexFile 是可选的,用于需要基于消息属性进行快速查找的场景。
消息存储流程
- 接受消息:Broker 接受消息后,将其放入内存缓冲区(待写入CommitLog)。
- 写入 CommitLog
- 每条消息追加到当前活跃的 ComitLog 文件中。使用顺序写入提升写入效率和磁盘利用率
- 同步到 ConsumQueue
- 异步转发服务从 CommitLog 读取新写入消息
- 将消息的偏移量和其他元数据(如大小和 Tag 哈希值)存储到 ConsumeQueue 文件中。
- 更新 IndexFile(可选)
- 若消息带有 Key(如业务 ID),则将其哈希和偏移量存入 IndexFile。
- 这样,可以通过该 Key 快速查找消息。