Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

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 是可选的,用于需要基于消息属性进行快速查找的场景。
消息存储流程
  1. 接受消息:Broker 接受消息后,将其放入内存缓冲区(待写入CommitLog)。
  2. 写入 CommitLog
    • 每条消息追加到当前活跃的 ComitLog 文件中。使用顺序写入提升写入效率和磁盘利用率
  3. 同步到 ConsumQueue
    • 异步转发服务从 CommitLog 读取新写入消息
    • 将消息的偏移量和其他元数据(如大小和 Tag 哈希值)存储到 ConsumeQueue 文件中。
  4. 更新 IndexFile(可选)
    • 若消息带有 Key(如业务 ID),则将其哈希和偏移量存入 IndexFile。
    • 这样,可以通过该 Key 快速查找消息。

评论