您当前的位置:首页 > 电脑百科 > 数据库 > 百科

RocketMQ 存储设计到底强在哪?

时间:2022-10-27 15:22:13  来源:今日头条  作者:慕枫技术笔记

引言

对于一款消息中间件来说,优良的数据存储设计,是实现高性能消息吞吐以及消息查询的关键所在。因为消息中间件对于外部来说就是发消息消费消息的一个平台基础设施,但是从其本身来说,需要将海量消息数据信息持久化在 RocketMQ 节点所在的服务器上,这样即便是服务器断电,重启等情况下,也不至于丢失消息数据。另外在进行消息消费的时候,RocketMQ 如何能借助自身的存储设计快速检索到对应的消息也是非常重要的,因此本文主要对 RocketMQ 存储设计进行了设计分析。

存储结构

RocketMQ 对应的存储文件主要包括三类,分别是 Commitlog 文件、ConsumeQueue 文件以及 Index 文件,每一个文件都有其特殊的使命。

 

Commitlog 文件

当生产者将消息发送到 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 宕机了,那么此时的消息数据是容易丢失的。所以虽然异步刷盘的写入效率高但是也存在数据丢失的风险。

1、同步刷盘

在同步刷盘的场景下,当 Broker 接受到对应的消息之后,Broker 将会把这条消息刷入磁盘的 CommitLog 中,才会返回确认消息给生产者。如果在进行消息写入的时候 Broker 挂了,那么生产者会感受到消息投递失败,一般都会都有消息重新发送的重试逻辑。

这样看消息似乎不会丢失了,但是由于每次都是先落盘,就会导致数据写入性能下降。

MMAP

在 RocketMQ 中使用了 mmap 技术来实现 Conmmitlog 文件的高性能读写,mmap 就是一种内存映射文件的方法,对于传统的文件 IO 交互来说,需要经过多次的数据复制过程才能将用户进程的数据写入硬盘或者读入程序。而 mmap 可以直接将虚拟内存中的文件与硬盘中文件地址进行映射,减少了数据拷贝的过程,从而提升了数据写入的效率。关于这部分的内容可以参见以前的文章有详细的介绍。

总结

本文主要堆 RocketMQ 的存储设计进行了分析,围绕如何实现高性能消息写入和查询展开了阐述,希望在分析这些优秀中间的具体实现过程中,我们可以将这些优秀设计融入到具体的项目实践中,当我们遇到类似的问题的时候可以借助于这些设计思想来解决实际的问题。



Tags:RocketMQ   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
如何应对 RocketMQ 消息堆积
这篇文章,我们聊聊如何应对 RocketMQ 消息堆积。图片1 基础概念消费者在消费的过程中,消费的速度跟不上服务端的发送速度,未处理的消息会越来越多,消息出现堆积进而会造成消息消...【详细内容】
2023-12-21  Search: RocketMQ  点击:(71)  评论:(0)  加入收藏
Apache RocketMQ 5.0腾讯云落地实践
Apache RocketMQ 发展历程回顾RocketMQ 最早诞生于淘宝的在线电商交易场景,经过了历年双十一大促流量洪峰的打磨,2016年捐献给 Apache 社区,成为 Apache 社区的顶级项目,并在国...【详细内容】
2023-12-13  Search: RocketMQ  点击:(134)  评论:(0)  加入收藏
聊聊 RocketMQ 5.0 的 POP 消费模式!
大家都知道,RocketMQ 消费模式有 PULL 模式和 PUSH 模式,不过本质上都是 PULL 模式,而在实际使用时,一般使用 PUSH 模式。不过,RocketMQ 的 PUSH 模式有明显的不足,主要体现在以下...【详细内容】
2023-05-16  Search: RocketMQ  点击:(303)  评论:(0)  加入收藏
40个定时任务!这次带你彻底理解 RocketMQ 设计精髓!
今天来分享 RocketMQ 的定时任务。通过这些定时任务,能让我们更加理解 RocketMQ 的消息处理机制和设计理念。从 RocketMQ 4.9.4 的源代码上看,RocketMQ 的定时任务有很多,今天...【详细内容】
2023-01-29  Search: RocketMQ  点击:(207)  评论:(0)  加入收藏
RocketMQ 存储设计到底强在哪?
引言对于一款消息中间件来说,优良的数据存储设计,是实现高性能消息吞吐以及消息查询的关键所在。因为消息中间件对于外部来说就是发消息消费消息的一个平台基础设施,但是从其本...【详细内容】
2022-10-27  Search: RocketMQ  点击:(384)  评论:(0)  加入收藏
RocketMq 消息重试机制、死信队列
消息队列中的消息消费时并不能保证总是成功的,那失败的消息该怎么进行消息补偿呢?这就用到今天的主角消息重试和死信队列了。生产者消息重试有时因为网路等原因生产者也可能发...【详细内容】
2022-10-07  Search: RocketMQ  点击:(288)  评论:(0)  加入收藏
5张图带你理解 RocketMQ 顺序消息实现机制
作者:君哥聊技术来源: https://mp.weixin.qq.com/s/n9QlZ73SQyCGIyPLvHMy0A大家好,我是君哥。今天聊一聊 RocketMQ 的顺序消息实现机制。在有些场景下,使用 MQ 需要保证消息的顺...【详细内容】
2022-06-29  Search: RocketMQ  点击:(302)  评论:(0)  加入收藏
▌简易百科推荐
向量数据库落地实践
本文基于京东内部向量数据库vearch进行实践。Vearch 是对大规模深度学习向量进行高性能相似搜索的弹性分布式系统。详见: https://github.com/vearch/zh_docs/blob/v3.3.X/do...【详细内容】
2024-04-03  京东云开发者    Tags:向量数据库   点击:(5)  评论:(0)  加入收藏
原来 SQL 函数是可以内联的!
介绍在某些情况下,SQL 函数(即指定LANGUAGE SQL)会将其函数体内联到调用它的查询中,而不是直接调用。这可以带来显著的性能提升,因为函数体可以暴露给调用查询的规划器,从而规划器...【详细内容】
2024-04-03  红石PG  微信公众号  Tags:SQL 函数   点击:(5)  评论:(0)  加入收藏
如何正确选择NoSQL数据库
译者 | 陈峻审校 | 重楼Allied Market Research最近发布的一份报告指出,业界对于NoSQL数据库的需求正在持续上升。2022年,全球NoSQL市场的销售额已达73亿美元,预计到2032年将达...【详细内容】
2024-03-28    51CTO  Tags:NoSQL   点击:(14)  评论:(0)  加入收藏
为什么数据库连接池不采用 IO 多路复用?
这是一个非常好的问题。IO多路复用被视为是非常好的性能助力器。但是一般我们在使用DB时,还是经常性采用c3p0,tomcat connection pool等技术来与DB连接,哪怕整个程序已经变成以...【详细内容】
2024-03-27  dbaplus社群    Tags:数据库连接池   点击:(14)  评论:(0)  加入收藏
八个常见的数据可视化错误以及如何避免它们
在当今以数据驱动为主导的世界里,清晰且具有洞察力的数据可视化至关重要。然而,在创建数据可视化时很容易犯错误,这可能导致对数据的错误解读。本文将探讨一些常见的糟糕数据可...【详细内容】
2024-03-26  DeepHub IMBA  微信公众号  Tags:数据可视化   点击:(7)  评论:(0)  加入收藏
到底有没有必要分库分表,如何考量的
关于是否需要进行分库分表,可以根据以下考量因素来决定: 数据量和负载:如果数据量巨大且负载压力较大,单一库单一表可能无法满足性能需求,考虑分库分表。 数据增长:预估数据增长...【详细内容】
2024-03-20  码上遇见你  微信公众号  Tags:分库分表   点击:(16)  评论:(0)  加入收藏
在 SQL 中写了 in 和 not in,技术总监说要炒了我……
WHY?IN 和 NOT IN 是比较常用的关键字,为什么要尽量避免呢?1、效率低项目中遇到这么个情况:t1表 和 t2表 都是150w条数据,600M的样子,都不算大。但是这样一句查询 ↓select *...【详细内容】
2024-03-18  dbaplus社群    Tags:SQL   点击:(6)  评论:(0)  加入收藏
应对慢SQL的致胜法宝:7大实例剖析+优化原则
大促备战,最大的隐患项之一就是慢SQL,对于服务平稳运行带来的破坏性最大,也是日常工作中经常带来整个应用抖动的最大隐患,在日常开发中如何避免出现慢SQL,出现了慢SQL应该按照什...【详细内容】
2024-03-14  京东云开发者    Tags:慢SQL   点击:(5)  评论:(0)  加入收藏
过去一年,我看到了数据库领域的十大发展趋势
作者 | 朱洁策划 | 李冬梅过去一年,行业信心跌至冰点2022 年中,红衫的一篇《适应与忍耐》的报告,对公司经营提出了预警,让各个公司保持现金流,重整团队,想办法增加盈利。这篇报告...【详细内容】
2024-03-12    InfoQ  Tags:数据库   点击:(32)  评论:(0)  加入收藏
SQL优化的七个方法,你会哪个?
一、插入数据优化 普通插入:在平时我们执行insert语句的时候,可能都是一条一条数据插入进去的,就像下面这样。INSERT INTO `department` VALUES(1, '研发部(RD)', &#39...【详细内容】
2024-03-07  程序员恰恰  微信公众号  Tags:SQL优化   点击:(20)  评论:(0)  加入收藏
站内最新
站内热门
站内头条