RocketMQ.Store
Store,RocketMQ的存储系统,将消息持久化到文件系统中。使用CommitLog保存消息载体,使用ConsumeQueue保存消息在CommitLog的位置Offset。客户端根据ConsumeQueue获取到位置Offset后,再根据位置Offset到CommitLog中查找消息。
每个Topic下的每个MessageQueue都有一个对应的ConsumeQueue文件。每台Broker上的CommitLog被本机器所有ConsumeQueue共享。在CommitLog中,一个消息的存储长度是不固定的。
消息写入RocketMQ,有两种写磁盘方式:
- 异步刷盘:消息可能只是写入了内存的PageCache,写操作的返回快,吞吐量大;当内存消息量积累到一定程度时,统一出发写磁盘动作。
- 同步刷盘:消息写入磁盘才返回成功。消息写入内存PageCache后,立刻通知刷盘线程刷盘,然后等待刷盘完成,返回成功。
DefaultMessageStore
DefaultMessageStore
系统默认的消息存储服务,将接收到的消息持久化到CommitLog文件中,然后将消息在CommitLog文件中的偏移量Offset保存到ConsumeQueue队列中。默认map 1G的虚拟内存。
CommitLog
CommitLog文件保存了消息的所有信息,包括消息内容和消息元数据。CommitLog首先将消息文件映射到虚拟内存,通过直接操作虚拟内存提高读写速度,然后更过定期刷盘操作,将虚拟内存的数据写入磁盘文件,持久化消息数据。
ConsumeQueue
ConsumeQueue保存了消息在CommitLog中的位置信息。客户端读取消息首先通过ConsumeQueue获取消息的位置信息,然后通过位置信息从CommitLog中读取消息。
ConsumeQueue按Topic进行分类存储。
MapedFile
ReocketMQ通过直接将消息文件映射成虚拟内存,减少由于读写消息文件造成的用户空间和内核空间的切换,提高读写效率。