RocketMQ在存储架构上的极致追求

RocketMQ与RabbitMQ深度对比:技术选型与实战场景解析 消息队列作为分布式系统架构中的核心组件,其核心原理在于实现系统间的异步通信、解耦和流量削峰。通过可靠的消息传递机制,它确保了数据在不同服务间的有序流转,从而提升了系统的可扩展性和容错能力。这一技术在现代微服务架构和云原生环境中具有极高的价值,广泛应用于电商交易、金融支付、物联网数据采集和实时日志处理等场景。本文聚焦于RocketMQ和RabbitMQ这两款主流消息中间件的对比,其中RocketMQ以其为海量数据设计的分布式架构和强大的消息堆积能力著称,而RabbitMQ则以其灵活的AMQP协议支持和复杂路由 阅读详情

内容导读: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来被消费者订阅和消费;

其中每个索引项是一个固定大小为20bytes的记录,由消息在commitLog中的起始偏移量、消息体占用大小、type的hash码三部分构成。可以通过这三个部分快速定位到所需消息位置和类型。

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

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

消息的消费

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

offset消费位点记录

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

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

Part four / 读效率的追求

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

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

利用NIO的内存映射机制,我们将commitLog的一部分文件交换到对外内存。然后利用操作系统的pageCache技术,在运行过程中把内存里的信息,与磁盘里的文件信息进行同步,或者交换:

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

摘自:Qcon大会 RocketMQ分享资料

Part five / 总结

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

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

Java电商秒杀系统性能优化(一)——电商秒杀系统框架回顾 电商秒杀系统框架回顾项目简介外部依赖框架回顾项目要点项目中存在的问题小结 课程是免费的,课程地址如下:SpringBoot搭建电商秒杀项目,课程真的很棒,作者的思路很清晰,建议各位读者可以跟着视频练习一下这个项目; 项目简介 通过SpringBoot快速搭建的前后端分离的电商基础秒杀项目。项目通过应用领域驱动型的分层模型设计方式去完成:用户otp注册、登陆、查看、商品列表、进入商品详情以及倒计时秒... 阅读详情

相关推荐

基于Halium 9为小米平板4移植Ubuntu Touch:内核适配与驱动调试实战

在移动设备生态中,Linux内核作为核心,通过硬件抽象层(HAL)管理底层硬件驱动,为上层系统提供统一接口。其模块化设计允许深度定制,是实现跨平台移植的技术基础。Halium项目正是利用这一原理,构建了一个中间层,将安卓内核的硬件支持能力“翻译”成标准Linux发行版能识别的格式,从而在手机、平板等移动设备上运行Ubuntu Touch、postmarketOS等移动Linux系统,极大地拓展了老旧设备的再利用价值。这一技术为开发者提供了在常见安卓硬件上进行Linux系统开发与定制的可能,尤其在嵌入式与物联

weixin_42639246的博客 377

RocketMQ教程-(5)-功能特性-消费进度管理

Apache RocketMQ 通过消费位点管理消费进度,本文为您介绍 Apache RocketMQ 的消费进度管理机制。

720

RK3588嵌入式开发:从零构建Rockit多媒体处理引擎的实战指南

本文详细介绍了如何在RK3588嵌入式平台上从零构建Rockit多媒体处理引擎的实战指南。涵盖开发环境搭建、工具链配置、源码编译流程、硬件加速优化及典型问题解决方案,帮助开发者高效利用RK3588的NPU和VPU加速特性,实现高性能多媒体处理应用。

mango的博客 188

RocketMQ消费位置

RocketMQ创建消费者的时指定了Topic主题及Tag,我们发现新创建的消费者消费不了历史的数据,只能消费掉创建以后消费者发送的数据。这是什么原因,我们能把所有的消息都消费吗?,我们可以指定需要消费的消息的时间吗?答案是肯定的,下面我们具体分析一下。 前提:我们讨论是集群模式下的,广播模式也是一样的,只是示例代码我们用集群模式来讨论。 消息消费的位置目前提供了三种方式CONSUME_FROM_LAST_OFFSET(队列尾部消费)、CONSUME_FROM_FIRST_OFFSET(队列头部消费)、

luoqiang616477607的专栏 2630

从零开始:如何用Kimi OK Computer快速生成专业级数据分析报告和PPT(附实战案例)

本文详细介绍了如何利用Kimi OK Computer智能体模式,从零开始快速生成专业级数据分析报告和演示文稿。通过实战案例,解析了其任务规划、联网搜索、多工具协同和内容排版等核心能力,并提供了精准指令构造、工作流引导及成果精修的完整步骤,帮助用户高效完成从数据到成品的端到端交付。

weixin_29284201的博客 372

【项目管理】第8章 项目整合管理 --知识点整理

制定项目章程: 第一步,旨在明确项目的目标、范围、关键里程碑等关键信息,为项目的后续工作奠定基础。制订项目管理计划: 在项目章程的基础上,进一步详细规划项目的执行过程,包括时间、成本、质量、风险等方面的管理计划。指导与管理项目执行: 按照项目管理计划执行项目,同时监控项目的进展,确保项目按照计划进行。监控项目工作: 对项目的执行情况进行持续监控,及时发现并解决问题,确保项目目标的实现。

weixin_42081167的博客 1599

RocketMQ(六)-消费进度保存机制

消费进度保存机制 在消费者启动时 会 同时启动 位点管理器,位点具体是如何管理? RocketMQ 设计了 远程位点管理 和 本地位点管理 两种位点管理方式 集群消费时,位点 由客户端 提交给 Broker保存,具体实现代码在RemoteBrokerOffsetStore.java文件中 广播消费时,位点 保存在 消费者 本地磁盘上,实现代码在LocalFileOffsetStore.java文件中 ...

星光之子的博客 731

多角度模板匹配的模板创建技巧

基于形状的模板匹配多角度创建技巧

manuoo的专栏 3403

RocketMQ消息存储

转载:RocketMQ源码学习--消息存储篇 消息中间件—RocketMQ消息存储(一) RocketMQ高性能之底层存储设计 存储架构 RMQ存储架构 上图即为RocketMQ的消息存储整体架构,RocketMQ采用的是混合型的存储结构,即为Broker单个实例下所有的队列共用一个日志数据文件(即为CommitLog,1G)来存储。 Consume Queue相当于ka...

359

arcgis计算栅格平均值

打开FC栅格数据和非水体矢量数据 利用矢量数据提取对应栅格的非水体部分 2.1打开空间分析工具à提取分析à按掩膜提取 输入对应栅格数据和矢量数据 2.2提取结果如下 进行计算FC平均值 3.1打开空间分析工具à多元分析à波段集统计 输入对应栅格和输出路径 3.2统计结果如下 ...

Z_W_H_的博客 5371

用 ADT 连接 SAP S/4HANA Public Cloud 开发租户的完整落地指南

摘要:在SAP S/4HANA公有云中进行ABAP开发时,必须使用Development Tenant(客户端080)而非Customizing Tenant(客户端100)连接ADT工具。开发用户需具备SAP_BR_DEVELOPER角色且写权限不受限,开发对象应创建在结构包的子包中。连接前需确认正确的ABAP服务URL(通常为Launchpad URL去掉"/ui"),并通过运行控制台程序验证全链路功能。典型开发场景如通过BAdI实现业务校验时,需遵循Clean Core原则在指定包

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 342

RocketMQ基础理论&存储结构设计

本文从rocket存储结构方面深入剖析,意在加深对rocketMQ的高性能设计原理的理解,学习其设计思想

TianH_legend的博客 758

【CANoe示例分析】SOMEIPWithvCDL_16

本示例来源于官方提供的示例工程:0004_基于vCDL实现SOMEIP通信_Demo\0004_基于vCDL实现SOMEIP通信_Demo\SOMEIPWithvCDL。

jasonj333 571

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

MQ作为一款中间件,就需要承载全公司所有业务系统使用需求,并高效稳定运行。因此,MQ对本身运行效率有着非常苛刻的诉求。为了实现高效率,其实需要很多方面一起配合来完成。比如存储方式、内存使用、负载均衡等等。本文就RocketMQ为了实现高效的读写速率在存储架构上所做的努力,进行下阐述。为了更方便的进行数据读写,消息在磁盘底层的文件目录设计,都需要关注和解决什么问题呢:• 首先,最基本的,消息原始记录的写入和存储,且速率要快。 • 其次,要可以区分 ,特别是允许消费者按 进行接收。 • 再次,分布式集群下

JavaShark的博客 169

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

深度解析 RocketMQ 存储基石:CommitLog 物理架构与极致吞吐本质

RocketMQ存储核心:CommitLog架构与高性能设计解析 文章摘要 RocketMQ的CommitLog是其高性能存储的核心组件,采用统一聚合+顺序写入的架构设计。所有Topic的消息都以追加写(Append-Only)方式串行存储在1GB固定大小的物理文件中,通过严格的顺序写入策略最大化磁盘吞吐。结合内存映射(Page Cache)、零拷贝技术和灵活的刷盘机制(同步/异步),CommitLog实现了海量消息的高效持久化,成为RocketMQ高吞吐与低延迟的基础保障。其设计充分考虑了现代存储介质的物

qq_23277595的博客 1168

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

消息中间件存储架构深度解析:Kafka、RocketMQ、JMQ对比

在构建高并发系统时,消息中间件的存储架构往往决定性能上限。理解顺序写日志、稀疏索引、页缓存刷盘等核心原理,是掌握 Kafka、RocketMQ、JMQ 等主流消息队列的关键。存储设计直接影响数据落盘方式、消息定位效率与故障恢复能力,更与日志接入、事务消息、海量队列等场景的选型息息相关。本文从存储架构的底层问题出发,逐层拆解三款消息中间件的日志文件与索引机制,并结合生产环境中的延迟排查、磁盘规划和面试真题,帮助工程师建立从原理到实践的完整认知,为消息中间件选型提供可落地的参考依据。

weixin_42616115的博客 296

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Kafka、RocketMQ、JMQ存储架构对比:从顺序写到零拷贝的取舍逻辑

消息中间件是分布式系统中承接流量、解耦业务的核心组件,其存储架构直接决定了吞吐量、可靠性与运维成本。理解存储原理,需要从顺序写、页缓存、零拷贝、CommitLog、ConsumeQueue这些基础概念入手:顺序写让磁盘IO逼近极限,页缓存与零拷贝减少数据拷贝开销,索引设计则影响消息定位效率。不同消息中间件因诞生场景不同,在设计上各有侧重——Kafka以日志分段和稀疏索引换取高吞吐,适合日志管道与事件流;RocketMQ通过CommitLog统一串行写与ConsumeQueue逻辑索引保证业务可靠性,适用于交

weixin_29063979的博客 174

RocketMQ存储设计的奥妙

RocketMQ作为一款基于磁盘存储的中间件,具有无限积压能力,并提供高吞吐、低延迟的服务能力,其最核心的部分必然是它优雅的存储设计。1、存储概述RocketMQ存储的文件主要包括Commitlog文件、ConsumeQueue文件、Index文件。RocketMQ将所有主题的消息存储在同一个文件中,确保消息发送时按顺序写文件,尽最大能力确保消息发送的高可用性与高吞吐量。但消息中间件一般都是基于主题的订阅与发布模式,消息消费时必须按照主题进行帅选消息,显然从Commitlog文件中按照topic去筛选消息会

m0_72864708的博客 371

数据存储的思考——从RocketMQ和Mysql的架构入手

变长字段长度列表其实存储的是varchar()的相关信息,因为存储的时候的长度并不是确定的,需要一个变长的列表进行整个空间的说明,NULL标志位其实就是标记NULL值得——这里可以用bit进行表示(0表示一种状态、1表示一种状态),记录头信息这个东西比较重要的——稍后我也将从这个点去说明为什么我们需要记录整个行所占得字节,列数据就是实际的数据了(这里得详细信息推荐看小林Coding。修改的时候Mysql是以页为基本单位的,后续调整要是超过了相关的页存储的空间,会进行整页的复制,将数据记录复制到新的页中。

m0_74299224的博客 1395

RocketMQ - 存储机制深入:CommitLog、ConsumeQueue与IndexFile

RocketMQ 存储机制解析 核心摘要 RocketMQ采用创新的混合存储架构实现高性能消息处理: CommitLog:所有消息顺序写入单一文件,最大化磁盘I/O效率(顺序写可达3GB/s+) ConsumeQueue:轻量级索引(20字节/条)实现Topic/Queue逻辑隔离,支持毫秒级消费 IndexFile:哈希索引实现消息Key的快速检索(时间复杂度O(1)) 关键设计优势 单一CommitLog避免随机I/O,支持百万级TPS写入 异步构建ConsumeQueue保证消费性能(30万条/文件)

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

深入剖析RocketMQ分布式消息架构:从入门到精通的技术全景解析

在当今微服务盛行的时代,消息中间件已经成为分布式系统架构中不可或缺的基础组件。作为一名深耕分布式系统多年的架构师,我见证了从ActiveMQ到RabbitMQ,再到RocketMQ的技术演进历程。今天,我将带大家深入探索RocketMQ这个阿里巴巴开源的分布式消息中间件,从架构设计到实现细节,从理论分析到实战应用,为你呈现一个全方位的RocketMQ技术全景。

沉淀所学,分享所思,让热爱与成长同行。商务记录AI实战经验,助力开发者快速成长。 热爱AI,希望做出有影响力的技术成果。 技术点亮生活,分享连接价值与机会。 专注AI落地实战,陪你走好技术每一步。 2万+

RocketMQ Broker 刷盘机制:从零拷贝到底层存储的高性能密码

**摘要:RocketMQ的高性能存储架构核心在于其高效的刷盘机制。文章深入解析了同步刷盘与异步刷盘的底层原理,通过PageCache、mmap内存映射和零拷贝技术实现高效IO。同步刷盘通过fsync确保数据强一致性但性能较低,而异步刷盘依赖后台线程批量刷盘,牺牲部分可靠性换取更高吞吐。生产环境中需结合硬件选型、Linux内核参数调优(如脏页比例控制)和多副本机制进行优化,针对金融等高可靠场景推荐同步刷盘+SSD,电商等高吞吐场景可采用异步刷盘+多副本保障。

qq_23277595的博客 394

RocketMQ 深度解析:从核心概念到高可用架构的全面指南

RocketMQ作为阿里巴巴开源的分布式消息中间件,具备高吞吐、高可用和低延迟特性,适用于电商、金融等场景。其核心架构包括NameServer路由中心和Broker消息存储引擎,5.x版本新增Proxy层支持多协议。RocketMQ支持顺序消息、事务消息、延时消息等多种类型,提供灵活的消息过滤机制。生产环境推荐多Master多Slave部署,通过数据复制和故障转移确保高可用。性能优化方面,可通过批量发送、异步处理、合理配置线程等方式提升效率。RocketMQ 5.x版本增强了对云原生和多协议的支持,是构建分

fuquxiaoguang的博客 698
上一篇: 趣谈IO多路复用的本质趣谈IO多路复用的本质
下一篇: 吃下我这篇,Java面试第一关算是过了
JavaShark
博客等级 码龄4年 184粉丝 438原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值