阿里面试: RocketMQ如何实现每秒上十万QPS的超高吞吐量读取的?

news2024/10/9 1:11:18

这玩意儿表面看上去挺牛逼,但其实背后的逻辑和套路,在咱们开发里见过的那些招数,都能找到影子。

今天小北和大家一起系统化的梳理梳理一遍,让大家功力猛增,吊打面试官。

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:程序员编程资料站,有大厂完整面经,工作技术,架构师成长之路,等经验分享

求一键三连:点赞、分享、收藏

点赞对我真的非常重要!在线求赞,加个关注我会非常感激!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2197650.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ARTS Week 43

Algorithm 本周的算法题为 1822. 数组元素积的符号 已知函数 signFunc(x) 将会根据 x 的正负返回特定值: 如果 x 是正数,返回 1 。 如果 x 是负数,返回 -1 。 如果 x 是等于 0 ,返回 0 。 给你一个整数数组 nums 。令 product 为数…

SimpleFoc以及SVPWM学习补充记录

SimpleFoc SimpleFOC移植STM32(一)—— 简介 FOC控制的过程是这样的: 对电机三相电流进行采样得到 Ia,Ib,Ic。将 Ia,Ib,Ic 经过Clark变换得到 I_alpha I_beta。将 I_alpha I_beta 经过Park变换得到 Id,Iq。计算 Id,Iq 和其设定值 Id_ref 和…

Spring JDBC - Spring JDBC模版使用

前言 Spring JdbcTemplate是Spring Framework提供的一个强大的数据库访问工具,它简化了数据库操作的过程,为开发者提供了一个高级的数据库访问抽象层。 JdbcTemplate是Spring JDBC模块中的一个核心类,它位于org.springframework.jdbc.core包中…

开源项目都是怎么推广的?

大家好,我是爱折腾的刘大逵。跟我接触过的技术们都知道,一年一年的都在折腾着做一些项目,年年有进步,年年有想法,年年在折腾。今天给大家分享GITEE如何上推荐! GITEE推荐有什么用? 众所周知&a…

C++版iwanna2

第二篇目录 程序的流程图程序游玩的效果下一篇博客要说的东西 程序的流程图 #mermaid-svg-lFW0ZjCdi5Xvl3gE {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-lFW0ZjCdi5Xvl3gE .error-icon{fill:#552222;}#mermaid-s…

《神经网络》—— 循环神经网络RNN(Recurrent Neural Network)

文章目录 一、RNN 简单介绍二、RNN 基本结构1.隐藏中的计算2.输出层的计算3.循环 三、RNN 优缺点1.优点2.缺点 一、RNN 简单介绍 循环神经网络(Recurrent Neural Network, RNN)是一种用于处理序列数据的神经网络架构。 与传统的前馈神经网络&#xff08…

聆听国宝“心声” 《寻找国宝传颂人——中国国宝大会》走进辽宁

热爱不止,传颂不停。近日,中央广播电视总台《寻找国宝传颂人——中国国宝大会》大型融媒体活动在辽宁省博物馆开展第二场地方展演。辽宁省博物馆是新中国成立后的第一座博物馆,馆藏文物近12万件,珍贵文物数万件,且以藏…

计算机网络:数据链路层详解

目录 一、点对点信道: (1)封装成帧 (2)透明传输 (3)差错检测 二、点对点协议 (1)数据链路层的特点 (2)PPP协议的组成 (3&…

“我养你啊“英语怎么说?别说成I raise you!成人学英语到蓝天广场附近

“我养你啊”这句经典台词出自周星驰自导自演的电影《喜剧之王》。在这部电影中,周星驰饰演的尹天仇对张柏芝饰演的柳飘飘说出了这句深情而动人的台词。这句台词出现在柳飘飘即将离去之时,尹天仇鼓起勇气,用它作为对柳飘飘个人困境的承诺&…

docker compose入门5—创建一个3副本的应用

1. 定义服务 version: 3.8 services:web:image: gindemo:v2deploy:replicas: 3ports:- "9090" 2. 启动服务 docker compose -f docker-compose.yml up -d 3. 查看服务 docker compose ps 4. 访问服务

pycharm生成的exe执行后报错

元素 application 显示为元素 urn:schemas-microsoft-com:asm.v1^dependentAssembly (此版本的 Windows 不支持)的子元素。 日志名称: Application 来源: SideBySide 日期: 2024/10/8 14:14:12 事件 ID: 72 任务类别: 无 级别…

大数据新视界 --大数据大厂之 Presto 性能优化秘籍:加速大数据交互式查询

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

UE4 材质学习笔记05(凹凸偏移和视差映射/扭曲着色器)

一.凹凸偏移和视差映射 1.偏移映射 这需要一个高度图并且它的分辨率很低,只有256*256,事实上,如果高度图的分辨率比较低并且有点模糊,效果反而会更好 然后将高度图输出到BumpOffset节点的height插槽中, 之后利用得到…

登录注册静态网页实现(HTML,CSS)

实现效果图 实现效果 使用HTML编写页面结构,CSS美化界面,点击注册,跳转到注册界面,均为静态网页,是课上的一个小作业~ 使用正则表达式对输入进行验证,包括邮箱格式验证,用户名格式验证。 正则…

MATLAB数字水印系统

课题介绍 本课题为基于MATLAB的小波变换dwt和离散余弦dct的多方法对比数字水印系统。带GUI交互界面。有一个主界面GUI,可以调用dwt方法的子界面和dct方法的子界面。流程包括,读取宿主图像和水印图像,嵌入,多种方法的攻击&#xf…

九、4 串口接收(代码)

(1)在发送的基础上加上接收的部分 RX对应PA10,需要初始化PA10 (2)串口配置 如果使用查询,到这里就结束了,如果使用中断还需要在串口配置下面开启中断,配置NVIC (3&…

《深度学习》神经语言模型 Word2vec CBOW项目解析、npy/npz文件解析

目录 一、关于word2vec 1、什么是word2vec 2、常用训练算法 1)CBOW 2)SkipGram 二、关于npy、npz文件 1、npy文件 1)定义 2)特性 3)用途 4)保存及读取 运行结果: 运行结果&#xf…

使用.mdf及.ldf恢复SQL SERVER数据库

文章目录 [toc]1.使用.mdf和对应的.ldf文件恢复数据库1.1 将对应的.mdf和.ldf复制到SQL SERVER路径下1.2 打开SSMS 1.使用.mdf和对应的.ldf文件恢复数据库 1.1 将对应的.mdf和.ldf复制到SQL SERVER路径下 一般默认路径是:C:\Program Files\Microsoft SQL Server\MS…

【源码+文档】基于Java的新能源停车场管理系统的设计与实现

🚩如何选题? 如何选题、让题目的难度在可控范围,以及如何在选题过程以及整个毕设过程中如何与老师沟通,这些问题是需要大家在选题前需要考虑的,具体的方法我会在文末详细为你解答。 🚭如何快速熟悉一个项…

Pywinauto,一款 Win 自动化利器!

1.安装 pywinauto是一个用于自动化Python模块,适合Windows系统的软件(GUI),可以通过Pywinauto遍历窗口(对话框)和窗口里的控件,也可以控制鼠标和键盘输入,所以它能做的事情比之前介…