RocketMQ作为一款分布式消息中间件,其持久化主要是通过将消息存储在磁盘中实现的。 RocketMQ的持久化主要包括两个部分:Broker端的消息存储和Consumer端的消费位点存储。
1.Broker端消息存储:
RocketMQ Broker使用CommitLog、ConsumeQueue和IndexFile三种文件来持久化消息。
?CommitLog:所有消息主体以及元数据都存储在CommitLog中,它是RocketMQ的核心存储文件,采用顺序写的方式极大地提高了写入效率,并且利用操作系统的PageCache机制提升读取性能。
?ConsumeQueue:相当于CommitLog的索引文件,记录了消息在CommitLog中的offset信息,每个Topic下的每个Message Queue都有一个对应的ConsumeQueue文件。Consumer通过查询ConsumeQueue获取到消息在CommitLog中的位置,然后从CommitLog中读取消息。
?IndexFile(可选):是消息的索引文件,主要用于支持消息的查询过滤功能,比如根据Message ID、Key等属性查询消息。
2.Consumer端消费位点存储:
Consumer消费进度(即消费位点)会持久化存储在Broker上,这样即使Consumer宕机重启后也能从上次消费的位置继续消费。具体的消费进度信息也存储在Broker的CommitLog中。
配置方案:
在Broker端,默认已经开启了消息持久化的功能,无需额外配置。若需要调整存储路径、文件大小等相关参数,可以在broker.conf配置文件中进行设置,如storePathRootDir、mapedFileSizeCommitLog等。
在Consumer端,系统自动维护并更新消费进度,无需手动配置。
原理:
?当Producer发送消息时,RocketMQ Broker接收到消息后,会按照一定规则将消息序列化并写入CommitLog文件,同时更新相关队列的ConsumeQueue。
?当Consumer消费消息时,先从ConsumeQueue中查找到消息在CommitLog中的位置,然后从CommitLog读取消息内容进行消费,消费完成后更新消费进度到Broker。
这种设计既能保证消息的高可靠存储,又能有效提高消息的读写性能,符合RocketMQ高性能、高可用的设计目标。
#微头条首发挑战赛#
本文暂时没有评论,来添加一个吧(●'◡'●)