阿里面试: RocketMQ如何实现每秒上十万QPS的超高吞吐量读取的?
这玩意儿表面看上去挺牛逼,但其实背后的逻辑和套路,在咱们开发里见过的那些招数,都能找到影子。
今天小北和大家一起系统化的梳理梳理一遍,让大家功力猛增,吊打面试官。
1. 消息存储:巧妙利用顺序写
先说说消息存储。RocketMQ这货聪明得很,它用了顺序写这个绝招。
啥叫顺序写?
简单点讲,就是把消息按顺序往磁盘上写,省得磁盘脑袋疼。这和随机写比起来,效率高出好几条街。顺序写的好处在于磁盘的磁头不用东一头西一头地乱晃,直接一路跑下去,速度自然快得飞起。
为啥这个重要?
因为你要是搞随机写,那磁盘就得不断地在不同位置读写,时间全花在寻道上了。顺序写不需要来回折腾,直接就省下了大把时间,让RocketMQ在存储消息的时候跟打了鸡血似的,快速写入,简直停不下来。
最近无意间获得一份阿里大佬写的刷题笔记,一下子打通了我的任督二脉,进大厂原来没那么难。这是大佬写的,7701页的BAT大佬写的刷题笔记,让我offer拿到手软
2. 消息读取:多线程并发
再说说读取。你可能会问:“为啥读取也这么快?”
因为,RocketMQ这货是多线程并发搞定的。

它把消息分散到多个队列里,然后搞一堆线程来处理,谁也不耽误谁。这就跟多人同时搬砖一样,一个人搬一块肯定累死累活,一群人同时上,那砖堆嗖嗖就没了。
但多线程处理也不是说你线程越多越好。这事儿要是没控制好,线程多了反而会互相抢资源,搞不好还得打架。
RocketMQ在这块儿也动了不少脑筋,通过精细化管理线程池,保证每个线程都干自己的活,互不干扰,效率拉满。
3. 数据结构优化:减少I/O
RocketMQ里还用了不少数据结构上的小聪明。最重要的就是commitLog,这玩意儿是个append-only的结构

啥意思?就是消息只往里追加,不回头改。
这么干的好处是啥?
减少I/O操作,写入速度更快。而且,你追加写入的时候,也不用老是锁住整个文件,只需要锁住当前写入的位置就行,这样能大大减少锁的竞争,提升并发性能。
另外,RocketMQ还用上了内存映射文件(MappedFile)这种骚操作。把磁盘文件映射到内存中,操作起来跟直接读写内存差不多,虽然底层还是磁盘,但从开发者的角度看,I/O操作几乎是瞬间完成的,这也解释了为啥它的读写速度能跑得那么快。
4. 批量操作:减少频繁的网络交互
再来看看它的批量操作。这个其实挺简单的,RocketMQ这货并不是每收到一条消息就立马去写磁盘或者发送网络请求,它把消息攒到一定数量再统一处理,这就叫批量操作。
为啥要这么干?
因为频繁的网络交互和磁盘I/O都是时间黑洞,一个操作时间长,另一边就得等着。这一攒消息,就把这些操作给优化了,消息不至于像水龙头滴水一样流,而是一瓢一瓢地泼。
这个招数也不是谁都能用的,有些场景讲究时效性,不能等。但RocketMQ通过精确控制批量的大小和延时,既保证了性能,又不会让消息堆积太久,这就叫平衡得当。
最近无意间获得一份阿里大佬写的刷题笔记,一下子打通了我的任督二脉,进大厂原来没那么难。这是大佬写的,7701页的BAT大佬写的刷题笔记,让我offer拿到手软
5. 数据复制:异步复制和主从架构
最后一招就是数据复制。数据存储里最重要的一个环节就是容灾备份,这就要说到RocketMQ的异步复制和主从架构。
异步复制是个啥意思?
你写完数据不用等所有备份都完成,先让写操作返回,备份的事儿咱慢慢来。这样主节点就不至于被拖慢,能继续高速处理新的请求。
至于主从架构,这货其实就是主节点负责主要的写操作,从节点负责读取和备份。通过分工合作,读取请求就不会把主节点的资源吃光,让系统的整体吞吐量进一步提高。

6. 零拷贝
零拷贝的本质就是减少CPU在数据传输中的干预,让数据在内存和磁盘之间流动时不经过用户态。
这是个啥概念呢?
平时咱们操作系统要读取一个文件,比如从磁盘读到内存,然后再发给网络,这个过程中数据一般要经过4次拷贝。
如下图:

通常会是从磁盘到内核缓冲区,再从内核缓冲区拷贝到用户态的应用程序缓冲区,最后再从应用程序缓冲区回到内核缓冲区,最终发到网络上。
这几趟下来,CPU忙得不可开交,性能也就损失了一大截。
零拷贝就是把这个中间过程简化到最少。
RocketMQ利用操作系统的零拷贝技术,让数据直接从内核缓冲区传到网络上,完全跳过了用户态的拷贝。

这么做的好处是啥?
减少了不必要的CPU占用,同时提高了数据传输的效率。特别是在处理大文件或大量消息时,零拷贝的作用尤为明显,它能大大降低系统的负载,让RocketMQ在高吞吐量场景下依然保持流畅。
总结:不止是快,更是稳
总的来说,RocketMQ能实现每秒上十万QPS的超高吞吐量,靠的就是这些个聪明的策略和优化。
它在存储、读取、I/O、网络交互以及数据复制上都动了不少脑筋,每一块儿都拿捏得死死的。你别看它搞得玄乎,其实就是把咱们开发中遇到的瓶颈一个一个给突破了。
RocketMQ不止是快,更重要的是稳。稳到你几乎感觉不到它的存在,一切都在后台默默搞定。这也就解释了为啥这么多人爱用它——少折腾,效率高。
最后说一句(求关注,求赞,别白嫖我)
最近无意间获得一份阿里大佬写的刷题笔记,一下子打通了我的任督二脉,进大厂原来没那么难。
这是大佬写的, 7701页的BAT大佬写的刷题笔记,让我offer拿到手软
本文,已收录于,我的技术网站 cxykk.com:程序员编程资料站,有大厂完整面经,工作技术,架构师成长之路,等经验分享
求一键三连:点赞、分享、收藏
点赞对我真的非常重要!在线求赞,加个关注我会非常感激!
相关文章:
阿里面试: RocketMQ如何实现每秒上十万QPS的超高吞吐量读取的?
这玩意儿表面看上去挺牛逼,但其实背后的逻辑和套路,在咱们开发里见过的那些招数,都能找到影子。 今天小北和大家一起系统化的梳理梳理一遍,让大家功力猛增,吊打面试官。 1. 消息存储:巧妙利用顺序写 先说…...
web:js原型污染简单解释
1. 什么是对象? 在 JavaScript 中,对象是一种包含属性和方法的数据结构。你可以把对象想象成一个存储键值对的容器。每个键(key)都有一个对应的值(value),这个值可以是数据或者函数。 let per…...
【C++打怪之路Lv7】-- 模板初阶
🌈 个人主页:白子寰 🔥 分类专栏:C打怪之路,python从入门到精通,数据结构,C语言,C语言题集👈 希望得到您的订阅和支持~ 💡 坚持创作博文(平均质量分82)&#…...
实战OpenCV之模板匹配
基础入门 模板匹配是计算机视觉中一种常用的图像处理技术,用于在较大的目标图像中寻找与给定模板图像相似的子区域。这项技术的基本思想是在主图像中寻找与模板图像最相似的子区域,广泛应用于目标检测、图像识别等领域。模板匹配的主要流程包括如下三点。 1、滑动窗口。将模板…...
【C++ 11】for 基于范围的循环
文章目录 【 1. 基本用法 】【 2. for 新格式的应用 】2.1 for 遍历字符串2.2 for 遍历列表2.3 for 遍历的同时修改元素 问题背景 C 11标准之前(C 98/03 标准),如果要用 for 循环语句遍历一个数组或者容器,只能套用如下结构&#…...
创建索引时需要考虑的关键问题详解
引言 在数据库中,索引是加快数据查询速度的重要工具。通过索引,数据库可以快速定位需要的数据,而无需扫描整个表的数据。尽管索引能极大提高查询效率,但不合理的索引设计也可能导致性能下降,甚至增加不必要的系统开销…...
【JavaEE】【多线程】Thread类讲解
目录 Thread构造方法Thread 的常见属性创建一个线程获取当前线程引用终止一个线程使用标志位使用自带的标志位 等待一个线程线程休眠线程状态线程安全线程不安全原因总结解决由先前线程不安全问题例子 Thread构造方法 方法说明Thread()创建线程对象Thread(Runnable target)使用…...
硬件面试(一)
网上别人的硬件面试记录,察漏补缺: 1.骄傲容易被打脸! 励磁电感和谐振电感的比值K大小有什么含义: 励磁电感和谐振电感的比值 KKK 通常用来衡量电路的特性。当 KKK 较大时,表示励磁电感相对于谐振电感较强,可能导致…...
9-贪心算法
PDF文档下载:LeetCode-贪心算法-java 参考:代码随想录 题目分类大纲如下: 贪心算法理论基础 什么是贪心? 贪心的本质是选择每一阶段的局部最优,从而达到全局最优。 贪心的套路(什么时候用贪心ÿ…...
前端编程艺术(3)---JavaScript
目录 1.JavaScript 1.输出 2.变量和数据类型 3.运算符 4.数组 5.函数 6.面向对象 7.ES6面向对象 2.BOM 1.document对象 3.DOM 4.JSON 1.JavaScript JavaScript是一种脚本编程语言,通常用于为网页增加交互性和动态效果。它是一种高级语言ÿ…...
动态规划算法题目练习——91.解码方法
1.题目解析 题目来源:91.解码方法——力扣 测试用例 2.算法原理 基础版本 1.状态表示 由于题目只要求返回第i个位置的可能情况,则只需要开辟n(ns.size())个大小的dp表即可 2.状态转移方程 题目可知第i个位置可以单独解码也可以与前一个位置组合解码&am…...
每天一个数据分析题(四百九十二)- 主成分分析与因子分析
在因子分析中,因子载荷矩阵是用来表示( )。 A. 变量和因子之间的关系 B. 样本和因子之间的关系 C. 变量和样本之间的关系 D. 因子和因子之间的关系 数据分析认证考试介绍:点击进入 题目来源于CDA模拟题库 点击此处获取答案…...
Linux shell编程学习笔记86:sensors命令——硬件体温计
0 引言 同事们使用的Windows系统电脑,经常莫名其妙地装上了鲁大师,鲁大师的一项功能是显示系统cpu等硬件的温度。 在Linux系统中,sensors命令可以提供类似的功能。 1 sensors命令 的安装和配置 1.1 sensors命令 的安装 要使用sensors命…...
基于SSM车位租赁系统【附源码】
基于SSM车位租赁系统 效果如下: 注册页面 首页展示 车位租赁订单展示 车位列表页面 公告信息管理页面 公告类型管理界面 研究背景 随着经济的持续增长和城市化进程的加速,土地资源变得日益紧缺,停车难问题已成为许多城市面临的共同挑战。随…...
JAVA开源项目 新生报到网站 计算机毕业设计
本文项目编号 T 002 ,文末自助获取源码 \color{red}{T002,文末自助获取源码} T002,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 提…...
QT将QBytearray的data()指针赋值给结构体指针变量后数据不正确的问题
1、问题代码 #include <QCoreApplication>#pragma pack(push, 1) typedef struct {int a; // 4字节float b; // 4字节char c; // 1字节int *d; // 8字节 }testStruct; #pragma pack(pop)#include <QByteArray> #include <QDebug>int main() {testStruct …...
修改银河麒麟操作系统V10(SP1)网卡名称为ethx
修改银河麒麟桌面操作系统V10(SP1)网卡名称为ethx 步骤一:查看当前网卡信息步骤二:修改GRUB配置文件步骤三:更新GRUB配置步骤四:编辑网络接口文件步骤五:重启机器 💖The Begin&#…...
MySQL多表查询:标量子查询
先看我的emp表结构 emp表 子查询基本语法 select * from t1 where column1 (select column1 from t2);例子1:查询"销售部" 的所有员工信息 这个可以先拆解为两个 a.查询"销售部"的部门ID select id from dept where name 销售部; b. 根…...
C++学习笔记----8、掌握类与对象(六)---- 操作符重载(1)
经常在对象上执行如相加,比较,文件传输等操作。例如,spreadsheet只有在可以在上面执行自述运算才有用,比如对整行的单元格求和。所有这些都可以通过重载操作符来完成。 许多人发现操作符重载的语法复杂而令人迷惑。至少一开始是这…...
Ascend C 自定义算子开发:高效的算子实现
Ascend C 自定义算子开发:高效的算子实现 在 Ascend C 平台上,开发自定义算子能够充分发挥硬件的性能优势,帮助开发者针对不同的应用场景进行优化。本文将以 AddCustom 算子为例,介绍 Ascend C 中自定义算子的开发流程及关键技术…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
