RocketMQ 持久化机制
RocketMQ 的消息持久化主要依靠以下文件完成
-
CommitLog
日志数据文件,存储消息内容,所有 queue 共享,不区分 topic ,顺序读写 ,1G 一个文件
-
ConsumeQueue
逻辑 Queue,基于 topic 的 CommitLog 的索引文件
消息先到达 commitLog,然后异步转发到 consumeQueue,包含 queue 在 commitLog 中的物理偏移量 offset,消息实体内容大小和 Message Tag 的 hash 值,大于 600W 个字节,写满之后重新生成,顺序写
-
IndexFile
基于 Key 或 时间区间的 CommitLog 的索引文件,文件名以创建的时间戳命名,固定的单个 indexFile 大小为 400M,可以保存 2000W 个索引
RocketMQ 的 queue 只存储少量数据、更加的轻量化,对于磁盘的访问是串行化避免磁盘竞争;缺点:写入是顺序写,但读是随机读,先读 ConsumeQueue,再读 CommitLog ,会降低消息读的效率
消息发送到 broker 后,会被写入 commitLog,写之前加锁,保证顺序写入。然后转发到 consumeQueue
- 同步刷盘:消息持久化到磁盘才会给生产者返回 ACK,保证消息可靠,但是会影响性能
- 异步刷盘:消息写入 pageCache 就返回 ACK 给生产者,刷盘采用异步线程,降低读写延迟,提高性能和吞吐,但是消息有可能丢失