RocketMQ 的消息持久化机制

RocketMQ 持久化机制

RocketMQ 的消息持久化主要依靠以下文件完成

  1. CommitLog

    日志数据文件,存储消息内容,所有 queue 共享,不区分 topic ,顺序读写 ,1G 一个文件

  2. ConsumeQueue

    逻辑 Queue,基于 topic 的 CommitLog 的索引文件

    消息先到达 commitLog,然后异步转发到 consumeQueue,包含 queue 在 commitLog 中的物理偏移量 offset,消息实体内容大小和 Message Tag 的 hash 值,大于 600W 个字节,写满之后重新生成,顺序写

  3. IndexFile

    基于 Key 或 时间区间的 CommitLog 的索引文件,文件名以创建的时间戳命名,固定的单个 indexFile 大小为 400M,可以保存 2000W 个索引

RocketMQ 的 queue 只存储少量数据、更加的轻量化,对于磁盘的访问是串行化避免磁盘竞争;缺点:写入是顺序写,但读是随机读,先读 ConsumeQueue,再读 CommitLog ,会降低消息读的效率

消息发送到 broker 后,会被写入 commitLog,写之前加锁,保证顺序写入。然后转发到 consumeQueue

  • 同步刷盘:消息持久化到磁盘才会给生产者返回 ACK,保证消息可靠,但是会影响性能
  • 异步刷盘:消息写入 pageCache 就返回 ACK 给生产者,刷盘采用异步线程,降低读写延迟,提高性能和吞吐,但是消息有可能丢失

你可能感兴趣的:(中间件,java)