RocketMQ学习之发送消息的存储设计实现
2020-08-15 本文已影响0人
先生zeng
今天继续来分享,关于RocketMQ的在发送消息是broker是如何进行存储持久化的。从目前的MQ中间件来说,可以分为需要持久化类型和不需要持久化类型,现在大多数都是需要使用持久化类型的,比如ActiveMQ、RabbitMQ、Kafka等,大多数业务系统都要求需要支持持久化存储,来增加系统的高可用性。
另外从存储方式和效率来看,文件系统>KV存储>关系型数据库存储,直接操作文件系统是最快的,但是可靠性最低,而关系型数据库反而可靠性高。
关于存储的一些设计概要
RocketMQ用于存储设计了几个文件的概念包括Comitlog文件、ConsumeQueue文件、Index文件。他讲所有主题的消息存储在同一个文件,可以确保消息发送时,顺序的写文件,确保消息发送的性能跟高吞吐量。
一般我们消息回根据消息主题来检索消息,这样的话对RocketMQ设计来说,效率不高,为此又引入了一个ConsumeQueue文件,每个消息主题回包来多个消息消费队列,每个消息队列有一个消息文件这样。数据在comitLog中时,会异步转发到消息消费队列。
IndexFile,主要的设计也是为了加速消息的检索性能,会根据消息的属性来快速从comitLog中找出消息。主要存储消息key与Offset的对应关系。
下面看一下数据的流向图:
image.png
消息存储实现类:org.apache.rocketmq.store.DefaultMessageStore