消息存储由 ConsumeQueue 和 CommitLog 配合完成。
CommitLog 是消息的物理存储文件,ConsumeQueue是消息的逻辑队列,类似数据库索引文件,存储物理存储位置,每个 MessageQueue 对应一个 ConsumeQueue 文件,每台机器上的 CommitLog 被本机器所有 ConsumeQueue 共享。
为保证 CommitLog 和 ConsumeQueue 的一致性,CommitLog 中存储了 ConsumeQueue、Message Key、Tag 等信息,即使 ConsumeQueue 丢失,也可以通过 CommitLog 恢复出来。
消息日志文件 CommitLog 采用顺序写、随机度的机制,好处:
- 顺序写可以大大提高写入效率。
- 虽然是随机读,但可以利用系统的 pagecache 机制,批量从磁盘读取,作为 cache 缓存到内存,加速后续读取。