本文是建立在堆 rocketmq 有一定的了解后对 rocketmq 进行了抽象的高度终结
从 数据持久化、高可用、高性能、读写原理、扩容 几个关键点去梳理
顺序写入利用 PageCache 减少磁盘随机 seek,提升写入性能
一个 Topic 具有多个 MessageQueue,MessageQueue 分布在不同的 Broker 中进行存储,同时每个 MessageQueue 又在其它节点中保存有备份数据
发往当前 broker 的所有 topic 消息都顺序写入在一个 commitlog 文件中,一个 commitlog 文件默认为 1GB 写满了就创建一个新的文件
为了区分当前写入的消息是哪一个 topic 哪一个 messagequeue 的随后需要将 地址信息 写入到 /consumequeue/#{topic}/#{messagequeue}
中的 ConsumeQueue 文件中
ConsumeQueue 中只存储索引,所以一个文件能够存储更多的数据,同时每写满 1GB 创建一个新的文件
利用 mmap 映射 commitlog 和 consumequeue 文件到 PageCache 中,通过对 PageCache 的读写来提升性能,减少频繁磁盘 seek 开销
通过 mmap 建立映射关系后,还需要通过预热将磁盘数据加载一部分到 PageCache 中
同时为了支持我们可以根据 key 查询消费指定的消息,这就需要使用稀疏索引来实现,具体就是会维护 IndexFile 索引文件,在每存储一段消息之后,记录一条消息
<