RocketMQ高手之路系列之十三:RocketMQ存储设计到底强在哪?

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

当生产者将消息发送到RocketMQ的Broker之后,需要将消息进行持久化存储,防止消息数据丢失。RocketMQ将消息数据写入存储文件CommitLog中,按照消息的发送顺序写入文件当中,每个文件的大小约为1G,当达到文件大小限制后,就会创建新的CommitLog文件。RocketMQ作为消息中间件来说,最主要的数据流程就是基于主题的发布-订阅模式进行消息的发布以及消费,那么当消费者根据自己订阅的Topic进行消息消费的时候,Broker怎么在那么多的CommitLog文件中找到对应Topic的消息数据呢?

在这里插入图片描述

大家可以想一想,CommitLog文件中的消息数据是一条一条顺序写的,最笨的方法就是遍历文件,作为一款高性能的消息中间件,显然这不是一个好的解决方案。就像从数据库查询数据的时候,遍历的效率肯定是很低的。那么我们可不可以借助数据库提升数据查询的方式,使用索引来加快消息数据的查询呢?答案是肯定的。就像Mysql中的索引本身需要文件保存一样,在RocketMQ中页有单独保存索引的文件,就是ConsumerQueue文件。

ConsumerQueue文件

在RocketMQ中,每个Topic对应多个MessageQueue,每个MessageQueue对应一组ConsumerQueue文件索引文件。ConsumerQueue文件中存储了消息相对于CommitLog文件的offset偏移量,CommitLog文件本身实际上也是通过偏移量来进行命名如第一个文件是0000000000000,那么第二文件就是消息总量之和00000001232321,往后新的文件再进行累计。为什么这么做呢?主要就是在进行消息查找的时候根据消息的偏移量通过二分查找快速定位具体的CommitLog文件,提升消息查找效率。需要说明的是,Broker在进行消息写入CommitLog文件中就会异步将其对应的偏移量写入ConsumerQueue文件中。

在这里插入图片描述

在ConsumerQueue文件中实际存储了CommitLog文件的offset偏移量、消息长度以及tag的hashcode,组成20字节的block块。其在Broker上面的存储路径大致是:…/store/consumequeue/{topic}/{queueid}/{file}。其中topic就是生产中订阅的主题,因此消费者在消费消息的时候,Broker会根据其对应的Topic找到对应的 ConsumerQueue文件,进而找到其索引位置,再到CommitLog文件中直接定位具体的消息。

Index文件

另外RocketMQ的特性功能就是可以实现按照消息的属性进行消息搜索,即建立了索引 Key 的 hashcode 与物理偏移量的映射关系,根据 key 先快速定义到 commitlog 文件。

在这里插入图片描述

存储性能设计精髓


上文中为大家阐述了RocketMQ关于存储结构的设计,优秀的存储设计师实现高性能读写的前提。那么除了存储结构的设计,RocketMQ也使用了一些性能优化手段来实现其强大的消息吞吐能力。

消息顺序写

前文中说过,消息进入RocketMQ之后,消息数据是通过顺序写的方式落到CommitLog文件中的。那么这里面就涉及两个问题,为什么进行顺序写以及是不是直接写磁盘文件。

1、为什么要顺序写?

当新的数据到来时,只要在之前的文件末尾进行数据追加就可以,这样的数据写入效率要比随机写入的效率高。

2、每次数据写入的时候是直接写磁盘文件吗?

我们可以反过想,如果每次都是落盘写入的话实际效率是不高的,无法满足消息中间件这种高吞吐的性能要求,因此RocketMQ实际是借助操作系统的page cache来提升写入效率的,消息并不是直接写入磁盘,认识先写入操作系统的page cache,然后再通过异步刷盘的方式,写入CommitLog文件中,这样借助顺序写以及系统的page cache可以时间近乎内存的数据写入效率。

同步刷盘和异步刷盘

刚才所说的异步写入,其实就是RocketMQ的异步刷盘模式,但是大家想想这个模式有没有什么问题。为了提升数据吞吐量,消息数据过来后,并没有直接写盘,而是在系统中的page cache中。那么此时如果Broker宕机了,那么此时的消息数据是容易丢失的。所以虽然异步刷盘的写入效率高但是也存在数据丢失的风险。

面试结束复盘查漏补缺

每次面试都是检验自己知识与技术实力的一次机会,面试结束后建议大家及时总结复盘,查漏补缺,然后有针对性地进行学习,既能提高下一场面试的成功概率,还能增加自己的技术知识栈储备,可谓是一举两得。

以下最新总结的阿里P6资深Java必考题范围和答案,包含最全MySQL、Redis、Java并发编程等等面试题和答案,用于参考~

重要的事说三遍,关注+关注+关注!

历经30天,说说我的支付宝4面+美团4面+拼多多四面,侥幸全获Offer

image.png

更多笔记分享

历经30天,说说我的支付宝4面+美团4面+拼多多四面,侥幸全获Offer

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

1713646769436)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值