深度剖析: RocketMQ 在存储架构上的极致追求

RocketMq详解:一、RocketMQ 介绍及基本概念 Name Server和ZooKeeper的作用大致是相同的,从宏观上来看,Name Server做的东西很少,就是保存一些运行数据,Name Server之间不互连,这就需要broker端连接所有的Name Server,运行数据的改动要发送到每一个Name Server来保证运行数据的一致性(这个一致性确实有点弱),这样就变成了Name Server很轻量级,但是broker端就要做更多的东西了。这种方式优点是数据与服务都没有单点问题,Master 宕机时消息无延迟,服务与数据的可用性非常高。 阅读详情

MQ作为一款中间件,就需要承载全公司所有业务系统使用需求,并高效稳定运行。因此,MQ对本身运行效率有着非常苛刻的诉求。

为了实现高效率,其实需要很多方面一起配合来完成。比如存储方式、内存使用、负载均衡等等。

本文就RocketMQ为了实现高效的读写速率在存储架构上所做的努力,进行下阐述。

Part one / 存储结构选型对比

为了更方便的进行数据读写,消息在磁盘底层的文件目录设计,都需要关注和解决什么问题呢:

• 首先,最基本的,消息原始记录的写入和存储,且速率要快。 • 其次,要可以区分 topic  ,特别是允许消费者按 topic 进行接收。 • 再次,分布式集群下的多消费者负载均衡。

那么问题来了,消息文件该怎么设计呢?

如果按 topic 来拆分文件进行存储,是否可以?

• 缺点:生产者写入时选择对应的文件来写入。当数据量逐渐增大之后,定位查询文件地址,对磁盘的寻址所带来的性能损耗,将不再可以忽略。 • 优点:在消费时,可以直接加载相关文件进行读取,不会产生随机寻址。

如果用一整个文件来存消息呢?

• 优点:所有的 topic 都被写入一个文件中,这样,写入时,只要将消息按到达顺序序追加到文件尾部即可,很容易实现顺序写入。 • 缺点:消费时,需要根据辅助信息来在文件中定位消息,会产生随机读,损耗性能。

因此,不管是按 topic 拆开多文件存储,还是一整个文件存储做有利有弊,需要按实际需要进行权衡。

Part two / RocketMQ的存储方案选择

RocketMQ 存储原始消息选择的是写同一个文件。

生产者将消息顺序写入commitLog文件

究其原因,是由于 RocketMQ 一般都是普通业务场景使用居多,生产者和 topic 众多,如果都独立开各自存储,每次消息生产的磁盘寻址对性能损耗是非常巨大的。

旁证侧引:

kafka 的文件存储方式,是按 topic 拆分成 partation 来进行的。是什么样的原因,让 kafka 做出了和 RocketMQ 相反的选择呢?

个人认为,主要还是使用场景的区别, kafka 被优先选择用来进行大数据处理,相对于业务场景,数据维度的 topic 要少很多,并且 kafka 的生产者( spark flume binlog 等)机器会更加集中,这使得 kafka 选择按 topic

拆分文件的缺陷不那么突出,而大数据处理更重要的是消息读取,顺序读的优势得以被充分利用。

"

单 partation ,单 cunsumer 的 kafka ,性能异常的优秀

" 是经常被提及的一个观点,其原因,相信有了上面的分析应该也差不多有结论了。

Part three / RocketMQ怎样平衡读性能

从第一部分的存储方案对比可以知道, RocketMQ 为了保证消息写入效率,在存储结构上选择了 顺序写 ,势必会对消息的读取和消费带来不便。

那么,它是怎么来平衡消费时的读取速率的呢?

关键问题是,找到一种途径,可以快速的在 commitLog 中定位到所需消息的位置。

索引
RocketMQ
commitLog
索引文件
topic

存储架构和存储构建链路示意图

RocketMQ 的消息体构成

消息体元素构成

• topic 是业务场景的唯一标识,不可缺少; • queueId  在申请topic的时候确定,关联着消费索引 consumerQueue 中的队列ID; • tags  是消息特殊标签,用于业务系统订阅时提前过滤(这个功能真的是太重要了,吃过苦的同学都清楚); • keys  是消息的关键字,构建index索引,用于关键字查询用; • msgBody  是真实消息体;

消息由发布者发布,并依次的、顺序的写到 commitLog 里,消息一旦被写入,是不可以更改顺序和内容的。 commitLog 规定最大1个G,达到规定大小则写新的一个文件。

索引结构和构建过程

consumerQueue结构和创建过程

consumerQueue
queue
commitLog
commitLog
consumerQueue
topic
queue
queueId
bytes
commitLog
type
hash码

而上述索引的构建过程,是在消息被写入 commitLog 时,专门的后台服务-- putMessageService ,将索引信息分发到 consumerQueue 和index文件里,来构建索引项。

建索引的过程,实际上是一种分而治之思维的落地,除了索引,还有redis中的各种指标维护,核心是 分散压力到每次请求,避免了大规模集中计算。

消息的消费

消费者对应consumerQueue不一定是一对一的,因此,怎么来让每个新的消费者来了不会重复消费呢?

offset消费位点记录

在消息成功被拉取并消费时,后台任务 CommitOffsetManager 会将当前消费者,针对topic的消费位点进行记录,目的是让下一个或者重新启动单饿消费者记住这个消费位点,不至于重复消费。

因此,整个文件目录就一目了然了:

Part four / 读效率的追求

虽然通过上述文件存储结构的分析,我们知道,消费者可以根据索引文件中的索引项来快速定位, 但事实上,消息的发布和消费,不可能直接针对磁盘进行读写操作的,这样效率会非常非常低。

实际上,我们的操作基本是针对一块内存进行操作的。

commitLog
操作系统
pageCache

• 消息发布者,在发布消息的时候,首先把消息添加到内存里,然后根据刷盘的配置可以来指定是同步刷盘还是异步刷盘,来将内存中的数据同步到磁盘上。 • 消息的消费者,在消费消息的时候,大多数情况下,会直接命中到内存上,不会进行磁盘读,但极个别的情况下,需要消费的消息,在内存中没法找到,这时候,就需要用换页技术,将相关的信息,拉取到内存中。为什么是相关信息,而不是需要什么拉取什么?这是有一个机制,来保证潜在的即将被消费的信息直接换入内存,来提交效率。

摘自:Qcon大会 RocketMQ分享资料

Part five / 总结

整体一套处理流程看下来,其实我们可以看到很多熟悉的身影,比如Mysql的索引,redis的统计信息记录等等,都非常相似。

其实,我们可以这么认为:对于信息存储和查询的处理方案大都如出一辙,只要把握住最核心的部分,然后根据实际业务诉求进行适配优化,基本都是可以达到期望的结果的。

Apache RocketMQ高危漏洞CVE-2023-37582深度剖析与复现 远程代码执行(RCE)漏洞是网络安全领域常见的严重威胁,其原理在于攻击者能够通过未授权访问或输入验证缺陷,在目标系统上执行任意命令。这类漏洞通常源于对用户输入的处理不当,例如在拼接系统命令时未进行有效过滤或转义,从而形成命令注入。从技术价值看,深入理解RCE漏洞的成因与利用链,对于构建纵深防御体系、提升代码安全审计能力至关重要。在消息队列等分布式中间件的应用场景中,管理接口往往成为薄弱环节。本文聚焦于Apache RocketMQ NameServer组件中一个典型的高危漏洞(CVE-2023-37582) 阅读详情

相关推荐

探秘 RocketMQ 的 DLedgerServer:MemberState 的技术解析与深度剖析

在 RocketMQ 构建高可靠、强一致性消息系统的架构中,DLedgerServer 扮演着举足轻重的角色,而 MemberState 作为 DLedgerServer 内部用于描述节点状态的核心类,更是整个分布式日志模块稳定运行的关键。深入理解 MemberState 的设计理念、功能特性和工作原理,有助于我们揭开 RocketMQ 高可用背后的技术奥秘。本文将从多个维度对 DLedgerServer 中的 MemberState 进行详细介绍与剖析。​。

u013127325的博客 1103

RocketMQ深度百科全书式解析

​RocketMQ 是一个 ​。

zwh1zwh的博客 1636

Apache RocketMQ命令注入漏洞CVE-2026-40175深度剖析与实战复现

命令注入是一种常见的安全漏洞,其原理在于应用程序未对用户输入进行充分验证和过滤,直接将不可信数据拼接至系统命令中执行。这种漏洞通常源于开发过程中对用户输入数据的过度信任,导致攻击者能够通过构造特殊参数注入恶意指令。从技术价值看,理解命令注入有助于构建更安全的输入验证机制和防御体系,是安全开发生命周期(SDL)的重要环节。在应用场景上,命令注入漏洞广泛存在于Web应用、API接口及各类中间件管理界面中,尤其像Apache RocketMQ这类分布式消息中间件,其NameServer组件的HTTP管理API若存

weixin_30616969的博客 519

RocketMQ 深度详解

⑤Message:消息载体,封装业务数据。生产环境必用多Master多Slave主从模式,原因:Master负责读写,Slave同步数据,Master宕机后Slave无缝接管,无消息丢失,保障高可用和数据可靠性。Queue的核心作用是实现并行处理,多个Queue分布在不同Broker上,生产者负载均衡发送,消费者并行消费,提升吞吐量和并发能力。如果是「一个Topic一个文件」,Broker需要维护海量的文件映射关系,元数据存储压力大,而且Topic的创建/删除会带来大量的文件创建/删除操作,运维复杂。

xiaolyuh的专栏 3068

IBIS模型中的Pullup和Pulldown曲线详解:如何避免信号完整性设计中的常见错误

本文深入解析IBIS模型中Pullup和Pulldown曲线的关键作用,揭示其在信号完整性设计中的黄金法则。通过详细分析曲线特性、常见误区及验证方法,帮助工程师避免设计错误,优化高速PCB设计。文章还展示了曲线数据在动态终端匹配、串扰预测和电源完整性分析中的高级应用,提升设计效率和可靠性。

weixin_30275415的博客 452

Zabbix华为交换机光衰告警

zabbix使用自动发现监控huawei网络设备光衰

qq_31651649的博客 4530

RocketMQ全解

1 介绍 RocketMQ作为一款纯java、分布式、队列模型的开源消息中间件,支持事务消息、顺序消息、批量消息、定时消息、消息回溯等。 1.1 RocketMQ 特点 支持发布/订阅(Pub/Sub)和点对点(P2P)消息模型 在一个队列中可靠的先进先出...

拱卒的博客 1929

Calibre LVS错误排查实战:从Innovus到GDS的完整调试流程(附常见错误解析)

本文详细介绍了数字IC后端设计中,从Innovus工具输出数据到Calibre LVS物理验证的完整调试流程。文章系统性地讲解了LVS错误排查的方法论,包括报告解读、图形化定位以及针对器件不匹配、电源网络错误、短路开路等常见问题的深度解析与解决方案,旨在帮助工程师高效完成版图与原理图的一致性检查。

weixin_29218963的博客 778

RocketMQ 详解

RocketMQ 详解1. 基础概念2.RocketMQ 消费模式2.1 广播模式2.2 集群模式3. 基础架构3.1 Broker 的存储结构3.2 存储文件简介3.3 Consumer 端的负载均衡机制3.4 消息刷盘机制3.5 Mmap + pageCache3.5.1 传统IO 和 Mmap3.5.2 pageCache3.5.3 预映射机制 + 文件预热机制3.6 push/pull/pop3.7 Topic 分片3.8 查漏补缺3.8.1 消息的全局顺序和局部顺序3.8.2 零拷贝(Zero-c

weixin_44981707的博客 3万+

xilinx 暑期学校项目(二) 通过HLS实现二维傅里叶变换(2Dfft)及图像数据读入读出方法

要进行维纳滤波,首先就是要将图像矩阵通过二维fft变换到频域。 但是hls_fft.h中只有一维fft的函数,因此我们采用对行逐行进行一维fft,再对列逐行进行一维fft来实现二维fft的效果。 文章目录自带的fft例程二维fft的实现数据的读入和读出读入读出维纳滤波操作 自带的fft例程 自带的fft例程中包括有如下四个函数 void dummy_proc_fe( bool direction, config_t* config, cmpxData in[FFT_LENGTH],

战斗果冻的训练中心 2329

二进制部署的K8s集群,如何对到期证书更新

一年前搭建的k8s集群,突然不能够正常访问,出现502错误,首先怀疑容器没起来,先对问题进行排查,排查响应的容器有没有正常启动,状态一切正常,访问容器地址也可以正常访问,于是访问node port地址,发现无法正常访问,确定问题出现在svc中。 由于其他的应用、系统也无法提供正常的服务,应该是k8s的问题,非单个应用的原因。查看服务状态,kubectl describe svc xxx,endp...

时光旅行者 3773

工程师之夜系列分享第三十九篇:Kafka、RocketMQ、JMQ 存储架构深度对比

我们可以对比一下,如果HDFS没有block的设计,一个100T的文件也只能单独放在一个服务器上面,那就直接占满整个服务器了,引入block后,大文件可以分散存储在不同的服务器上。Kafka broker有一个参数,log.segment.bytes,限定了每个日志段文件的大小,最大就是1GB,一个日志段文件满了,就自动开一个新的日志段文件来写入,避免单个文件过大,影响文件的读写性能,这个过程叫做log rolling,正在被写入的那个日志段文件,叫做active log segment。

京东科技开发者 1272

Virtuoso ADE Explorer实战技巧:从基础操作到高级仿真

本文深入解析了Virtuoso ADE Explorer在模拟电路仿真中的核心价值与实战技巧。作为Cadence平台的专业工具,它专为高效、系统化的设计空间探索而生,能大幅提升PVT验证、参数扫描和蒙特卡洛分析的效率。文章从基础界面操作、并行仿真管理,到高级的参数扫描、数据报告生成及蒙特卡洛结果深度剖析,提供了全面的避坑指南与工作流优化建议,帮助工程师从重复劳动中解放,专注于电路设计与性能优化。

ios99的博客 903

RocketMQ:深度剖析Broker启动流程原理、源码

一、启动源 我们先看一个broker的启动脚本: nohup sh bin/mqbroker -n 100.10.100.100:9876 -c conf/broker.conf & 再看mqbroker启动脚本中: sh ${ROCKETMQ_HOME}/bin/runbroker.sh org.apache.rocketmq.broker.BrokerStartup $@ 至此,我们可以确定最终运行的是 BrokerStartup的main 方法,并将脚本参数以args的方式传入。 apac

健身变秃,coding变强 2398

使用ESP32设计嵌入式蓝牙游戏手柄

通过使用ESP32开发板和相关的库,我们可以设计和实现嵌入式蓝牙游戏手柄。连接到该设备后,您可以使用控制器模块的按钮和摇杆等元件来模拟游戏手柄的输入。根据您使用的具体模块和引脚分配,连接按钮和摇杆等控制元件到ESP32的GPIO引脚。ESP32是一款功能强大的微控制器,集成了Wi-Fi和蓝牙功能,非常适合用于开发物联网和嵌入式应用。请注意,本文仅提供了一个基于ESP32的嵌入式蓝牙游戏手柄设计示例,具体实现可能因硬件和需求而有所不同。确保开发板正确连接到计算机,并选择正确的开发板和端口。

CodeMaven的博客 1643

ShardingSphere 分库分表避坑:扩容数据迁移时,如何做到“不停机、不丢数据”?

停机:发布公告,凌晨 0 点停止对外服务。洗数据:跑一个巨大的脚本,把旧库数据 Hash 算出新路由,写入新库。改配置:修改代码里的分片规则。重启:祈祷数据没丢,服务正常。这种“刀耕火种”的方式,风险极高,且随着数据量增大,停机时间会变得不可接受。我们需要的是Online Migration (在线迁移)。分库分表扩容不再是“听天由命”的赌博。通过,我们将一次高风险的“运维操作”变成了一个可控的、可视化的“数据流转过程”。方案停机时间复杂度回滚难度传统停机清洗。

BUG猿的博客 885

RocketMQ 存储模型深度剖析:CommitLog、ConsumeQueue 与索引文件设计

RocketMQ存储模型通过CommitLog、ConsumeQueue和索引文件三者的协同设计,实现了高吞吐、低延迟的消息处理能力。CommitLog作为核心存储采用顺序写入保证高性能,ConsumeQueue提供队列维度的消费索引,索引文件支持基于Key的快速查询。这种"集中写入+分区读取+索引加速"的架构,在写入性能、读取效率和可靠性之间取得平衡,通过异步构建派生数据、固定大小文件组等设计,既满足消息持久化需求,又支持灵活的消息检索,为分布式消息中间件提供了可靠的存储解决方案。

码路同行 636

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

RocketMQ消息存储与高可用设计深度剖析

RocketMQ 通过顺序写磁盘、内存映射、灵活的刷盘与复制机制,实现了高性能、高可靠的消息存储和高可用架构。其核心设计思想在于性能与可靠性的平衡,并为不同业务场景提供了可配置的存储和高可用策略。通过源码与流程深度剖析,可以掌握其底层实现原理,实际应用中可结合业务需求进行针对性调优与优化。集成Spring Cloud、大数据等技术栈后,RocketMQ可支撑更广泛的分布式应用场景。理解其存储与高可用设计,有助于在实际工程中知其然更知其所以然,成为消息中间件领域的“高手”。速记口诀。

IT技术学习与工作笔记分享 1395

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

RocketMQ组件及原理深度剖析详解

RocketMQ于2017年9月成为Apache基金会的顶级项目。有着支撑亿级消息量的能力,可以为复杂的业务场景提供系统解耦、削峰填谷、以及低延迟、高吞吐的能力,下面将详细介绍RockeMQ的核心组件和功能,以及细节。 RocketMQ应用场景及作用? 应用解耦:用户调用订单系统创建订单后,分别调用库存系统、支付系统、物流系统,使用解耦之后,支付系统、库存系统、物流系统...

Leo专题 1294

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

RocketMQ、RabbitMQ、Kafka 全面对比与主流程深度剖析

RocketMQ适用于高吞吐、强顺序与事务保障场景,Java 生态友好。RabbitMQ适合灵活路由、协议多样、业务解耦需求,管理易用。Kafka天生为高吞吐、海量日志流处理而生,批量处理与大数据集成优势明显。

IT技术学习与工作笔记分享 1520

RocketMQ:高可用实战-->DLedger选举机制深度剖析

在阿里巴巴双十一大促和字节跳动全球消息同步场景中,DLedger作为RocketMQ的高可用核心组件,其RAFT实现经历了严苛的生产验证。本文将结合阿里云和字节跳动内部实践,深入解析其设计精髓。

weixin_43290370的博客 1423

深度剖析 RocketMQ 事务消息!

事务消息是为了保证分布式系统中消息的一致性而引入的一种消息类型。事务消息允许消息发送方在发送消息后,进行本地事务操作,并根据本地事务的执行结果来决定消息的最终状态(提交或回滚)。本文详细介绍了 RocketMQ 事务消息的基本流程,并通过源码分析揭示了其内部实现原理,尽管事务消息增加了系统的复杂性,但在需要保证消息一致性的场景中,它仍然是一种非常有效的解决方案,比如资金转账、订单处理、分布式事务、库存管理等场景。

m0_54369189的博客 2490

RocketMQ存储性能终极优化指南:从IOPS到吞吐量的全方位突破

RocketMQ作为阿里巴巴开源的分布式消息中间件,在大规模消息传递场景中表现出卓越的性能和可靠性。然而,随着业务量的增长,存储性能瓶颈往往成为制约系统吞吐量的关键因素。本指南将为您详细解析RocketMQ存储架构的核心设计,并提供从基础配置到高级优化的完整解决方案。 ## RocketMQ存储架构深度解析 RocketMQ的存储架构采用了分层设计理念,将物理存储与逻辑队列分离,这种设计为性能

gitblog_00354的博客 760

SpringCloudAlibaba全家桶之 深度剖析RocketMQ 中 Topic/Queue

Topic 首先需要提到的概念是Topic。Topic是RocketMQ中的一个重要概念,RocketMQ的各组件都是围绕着Topic建立起对应关系的。 在RocketMQ官方文档和本文中, Topic在不同的语境下被赋予了两种不同的语义: 消息的Topic属性值 在描述Consumer的订阅设置信息或消息的属性时。 Topic属性为某个值的消息(单个消息或消息集合) 在描述Broker,Producer和Consumer的对应关系,Queue以及负载均衡策略时。 为了实现消息队列的水平扩展和

李昊轩的博客 4304

Java实习模拟面试之RocketMQ:从基础到原理的深度剖析

RocketMQ 是一个由阿里巴巴开源并捐赠给 Apache 基金会的分布式消息中间件,具备高吞吐、低延迟、高可靠性和可扩展性,广泛应用于电商、金融、物联网等大规模分布式系统中。问题传统同步调用痛点RocketMQ 解决方案系统耦合度高服务间强依赖,一个故障导致链式失败消息解耦,生产者与消费者独立演进响应延迟大多个下游操作同步执行,用户等待时间长异步处理,提升主流程响应速度流量洪峰冲击突发流量压垮下游服务削峰填谷,平滑处理请求峰值若需保证同一业务维度的消息有序message,

吾为热爱计科,致力于知识分享的践行者,此博客是我在这条道路上留下的足迹。 855

rocketmq 组监听_深度剖析 Kafka/RocketMQ 顺序消息的一些坑

原文:深度剖析 Kafka/RocketMQ 顺序消息的一些坑不记得有多少人问过以下这个问题了:我觉得这个问题问得很频繁,而且非常经典,在这里我就以 Kafka 为例子,说说我对 Kafka 顺序消息的一些理解吧,如有理解不对的地方麻烦留言指点一下。通常我们在说顺序消费指的是生产者按照顺序发送,消费者按照顺序进行消费,听起来简单,但做起来却非常困难。我们都知道无论是 Kafka 还是 Rocket...

weixin_39957805的博客 206
上一篇: 图解 RocketMQ 的系统架构
下一篇: 当你请求www.baidu.com时都发生了什么?
JavaShark
博客等级 码龄4年 184粉丝 438原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值