当前位置: 首页 > news >正文

阿里面试: 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 参考:代码随想录 题目分类大纲如下: 贪心算法理论基础 什么是贪心? 贪心的本质是选择每一阶段的局部最优,从而达到全局最优。 贪心的套路(什么时候用贪心&#xff…...

前端编程艺术(3)---JavaScript

目录 1.JavaScript 1.输出 2.变量和数据类型 3.运算符 4.数组 5.函数 6.面向对象 7.ES6面向对象 2.BOM 1.document对象 3.DOM 4.JSON 1.JavaScript JavaScript是一种脚本编程语言,通常用于为网页增加交互性和动态效果。它是一种高级语言&#xff…...

动态规划算法题目练习——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&#xff08;SP1&#xff09;网卡名称为ethx 步骤一&#xff1a;查看当前网卡信息步骤二&#xff1a;修改GRUB配置文件步骤三&#xff1a;更新GRUB配置步骤四&#xff1a;编辑网络接口文件步骤五&#xff1a;重启机器 &#x1f496;The Begin&#…...

MySQL多表查询:标量子查询

先看我的emp表结构 emp表 子查询基本语法 select * from t1 where column1 (select column1 from t2);例子1&#xff1a;查询"销售部" 的所有员工信息 这个可以先拆解为两个 a.查询"销售部"的部门ID select id from dept where name 销售部; b. 根…...

C++学习笔记----8、掌握类与对象(六)---- 操作符重载(1)

经常在对象上执行如相加&#xff0c;比较&#xff0c;文件传输等操作。例如&#xff0c;spreadsheet只有在可以在上面执行自述运算才有用&#xff0c;比如对整行的单元格求和。所有这些都可以通过重载操作符来完成。 许多人发现操作符重载的语法复杂而令人迷惑。至少一开始是这…...

Ascend C 自定义算子开发:高效的算子实现

Ascend C 自定义算子开发&#xff1a;高效的算子实现 在 Ascend C 平台上&#xff0c;开发自定义算子能够充分发挥硬件的性能优势&#xff0c;帮助开发者针对不同的应用场景进行优化。本文将以 AddCustom 算子为例&#xff0c;介绍 Ascend C 中自定义算子的开发流程及关键技术…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

手机平板能效生态设计指令EU 2023/1670标准解读

手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读&#xff0c;综合法规核心要求、最新修正及企业合规要点&#xff1a; 一、法规背景与目标 生效与强制时间 发布于2023年8月31日&#xff08;OJ公报&…...