RocketMQ深度百科全书式解析
一、核心架构与设计哲学
1. 设计目标
- 海量消息堆积:单机支持百万级消息堆积,适合大数据场景(如日志采集)。
- 严格顺序性:通过队列分区(Queue)和消费锁机制保证局部顺序。
- 事务一致性:独创的 “半消息 + 事务状态回查” 机制,解决分布式事务难题。
2. 模块协作原理
- Producer → Broker:
消息发送时,Producer 根据 MessageQueueSelector 选择队列(默认轮询,可自定义哈希规则)。 - Broker → Consumer:
Consumer 使用 Pull API 主动拉取消息,Broker 支持 长轮询机制(挂起请求直到有新消息)。 - NameServer 动态发现:
Broker 每 30秒 向所有 NameServer 注册心跳,客户端每 30秒 拉取最新路由表。
二、存储引擎底层揭秘
1. CommitLog 的极致优化
- 顺序写盘:所有消息按到达顺序追加写入,磁盘吞吐达 600MB/s+(对比随机写<2MB/s)。
- 内存映射加速:使用 MappedByteBuffer 将文件映射到内存,减少内核态拷贝。
- 文件切割策略:
单个 CommitLog 文件默认 1GB,写满后新建文件,文件名用 起始偏移量 命名(如00000000000000000000)。
2. ConsumeQueue 索引构建
- 异步构建线程:
ReputMessageService实时解析 CommitLog,生成 ConsumeQueue 条目。 - 索引结构:
每个条目 20字节(8B偏移量 + 4B消息大小 + 8B Tag Hash),单个文件保存 600万条 索引。 - 快速定位算法:
根据消费位点(offset)计算文件位置:(offset % totalSize) * 20。
3. 高性能背后黑科技
- PageCache 妙用:利用操作系统缓存,消息写入先到 PageCache,异步刷盘。
- 零拷贝技术:Consumer 拉取消息时,通过
FileChannel.transferTo()直接发送网卡,避免内存拷贝。
三、高级特性源码级剖析
1. 事务消息全流程
// Producer 发送半消息
TransactionSendResult result = producer.sendMessageInTransaction(msg, null);// Broker 处理半消息(关键代码)
if (msgType == MessageType.Trans_Msg_Half) {// 存入半消息 Topic(RMQ_SYS_TRANS_Half_TOPIC)putHalfMessage(queue);
}// 事务状态回查(Broker 定时任务)
TransactionalMessageCheckService.check();
2. 顺序消息并发锁
- 队列锁机制:
Consumer 在消费时对队列加锁(lockMappedFile),确保同一队列同一时刻仅一个线程消费。 - 重试策略:
消费失败时,消息重试需保证回滚到原队列(sendMessageBack指定原队列ID)。
3. 延迟消息时间轮算法
- 时间轮结构:
预设18个延迟级别(1s~2h),对应SCHEDULE_TOPIC_XXXX的不同队列。 - 定时扫描线程:
ScheduleMessageService每秒扫描时间轮,将到期消息投递到目标 Topic。
四、集群与高可用实战手册
1. 部署拓扑方案
- 多 Master 多 Slave(异步复制):
- 适用场景:高吞吐,允许秒级数据丢失(如日志采集)。
- 配置示例:
brokerRole=ASYNC_MASTER flushDiskType=ASYNC_FLUSH
- 多 Master 多 Slave(同步双写):
- 适用场景:金融交易,零数据丢失。
- 配置示例:
brokerRole=SYNC_MASTER flushDiskType=SYNC_FLUSH
2. 跨机房容灾方案
- 异步复制跨机房:
Master 部署在机房A,Slave 部署在机房B,通过专线异步复制。 - 双主双写架构:
两地各部署 Master,通过 Sharding 将消息路由到不同机房(需应用层双写)。
3. 扩容与缩容操作
- 扩容 Broker:
- 新机器部署 Broker,启动时指定相同
brokerClusterName。 - 通过
mqadmin updateTopic将新 Broker 加入 Topic 队列。
- 新机器部署 Broker,启动时指定相同
- 缩容 Broker:
- 停止待下线 Broker。
- 执行
mqadmin wipeWritePerm禁止新消息写入。 - 等待消息消费完成后下线。
五、性能调优黄金法则
1. 生产者调优
- 批量发送:
List<Message> messages = new ArrayList<>(1000); // 填充消息... SendResult result = producer.send(messages); - 压缩算法:
启用 LZ4 或 ZSTD 压缩(compressMsgBodyOverHowmuch=4096)。
2. 消费者调优
- 并发消费:
consumer.setConsumeThreadMin(20); consumer.setConsumeThreadMax(64); - 批量拉取:
consumer.setPullBatchSize(32); // 每次拉32条
3. Broker 参数精调
- 内存分配:
# 堆内存(建议4G以上) JAVA_OPT="-Xms4g -Xmx4g -Xmn2g" # 直接内存(映射文件用) maxDirectMemorySize=2g - 网络线程池:
# 发送消息线程数 sendMessageThreadPoolNums=24 # 拉取消息线程数 pullMessageThreadPoolNums=24
六、监控与运维实战
1. 监控指标大盘
- 核心指标:
- 写入/消费 TPS
- 消息堆积量(
consumerOffset.json) - CommitLog 磁盘使用率
- 工具集成:
- Prometheus + Grafana:使用 RocketMQ Exporter 采集数据。
- RocketMQ Dashboard:官方控制台,实时查看 Topic/Group 状态。
2. 日志分析技巧
- 关键日志文件:
~/logs/rocketmqlogs/rocketmq_client.log:客户端异常。~/logs/rocketmqlogs/store.log:存储层错误。
- 日志关键字:
[REJECTREQUEST]:系统过载,触发流控。[CLIENT_NOT_EXIST]:消费组未注册。
3. 故障应急工具箱
- 重置消费位点:
mqadmin resetOffsetByTime -n localhost:9876 -g MyGroup -t MyTopic -s now - 强制删除 Topic:
mqadmin deleteTopic -n localhost:9876 -c DefaultCluster -t MyTopic
七、真实场景案例库
1. 电商订单超时关单
- 需求:30分钟未支付订单自动关闭。
- 实现:
- 订单创建时发送 延迟消息(Level=14对应30分钟)。
- 消费者收到消息后检查订单状态,执行关单逻辑。
2. 广告点击实时统计
- 需求:实时统计每秒广告点击量,应对流量高峰。
- 实现:
- 前端埋点发送点击消息到 RocketMQ。
- Flink 消费消息,实时聚合写入 Redis。
3. 分布式事务:跨系统积分抵扣
- 需求:支付成功后,扣减用户积分(积分系统独立)。
- 实现:
- 支付系统发送 事务消息(半消息)。
- 执行本地事务(更新支付状态),提交消息。
- 积分系统消费消息,执行积分扣减。
八、RocketMQ 5.0 新特性全览
1. 轻量级 Pop 消费模式
- 特点:无状态消费,Broker 管理消费进度。
- 代码示例:
SimpleConsumer consumer = new SimpleConsumer(...); List<MessageExt> messages = consumer.receive(1000, 30);
2. 消息轨迹 2.0
- 增强功能:
- 全链路追踪(生产者IP → Broker存储时间 → 消费者IP)。
- 集成 OpenTelemetry,支持 Jaeger/SkyWalking。
3. 多语言生态扩展
- 支持语言:Java、C++、Go、Python、Rust。
- Go 客户端示例:
producer, _ := rocketmq.NewProducer(...) err := producer.SendSync(context.Background(), message)
九、避坑指南(血泪教训)
1. 队列数不足导致消费堆积
- 现象:Topic 队列数=4,Consumer 实例=20 → 16个 Consumer 闲置。
- 解决:队列数 >= Consumer 实例数(建议队列数=Consumer实例数*2)。
2. 重复消费陷阱
- 根因:消费成功但 offset 提交失败(如Consumer宕机)。
- 预防:消费逻辑 幂等设计(如数据库唯一键)。
3. 磁盘满导致 Broker 挂死
- 预防:监控磁盘水位,设置
diskMaxUsedSpaceRatio=85。 - 应急:临时清理过期 CommitLog(
rm -rf ~/store/commitlog/00000000000000000000)。
十、终极总结
RocketMQ 是一个 “全场景消息中枢”,既能扛住每秒百万级消息洪峰(如双11订单),又能苛的事务一致性需求(如金融转账)。掌握其核心原理(存储引擎、事务机制)和调优技巧(批量发送、队列规划),足以应对 90% 的分布式系统挑战。记住,消息队列不是银弹,合理设计生产消费模型,才是稳定性的终极保障! 🚀
相关文章:
RocketMQ深度百科全书式解析
一、核心架构与设计哲学 1. 设计目标 海量消息堆积:单机支持百万级消息堆积,适合大数据场景(如日志采集)。严格顺序性:通过队列分区(Queue)和消费锁机制保证局部顺序。事务…...
谈谈模板方法模式,模板方法模式的应用场景是什么?
一、模式核心理解 模板方法模式是一种行为设计模式,通过定义算法骨架并允许子类重写特定步骤来实现代码复用。 如同建筑图纸规定房屋结构,具体装修由业主决定,该模式适用于固定流程中需要灵活扩展的场景。 // 基础请求处理…...
电脑的usb端口电压会大于开发板需要的电压吗
电脑的USB端口电压通常不会大于开发板所需的电压,以下是详细解释: 1. USB端口电压标准 根据USB规范,USB接口的标称输出电压为5V。实际测量时,USB接口的输出电压会略有偏差,通常在4.75V到5.25V之间。USB 2.0和USB 3.0…...
DeepSeek-V3与DeepSeek-R1全面解析:从架构原理到实战应用
DeepSeek-V3与DeepSeek-R1全面解析:从架构原理到实战应用 DeepSeek作为中国人工智能领域的新锐力量,其推出的DeepSeek-V3和DeepSeek-R1系列模型在开源社区和商业应用中引起了广泛关注。本指南将系统介绍这两款模型的架构特点、安装部署方法以及实际应用…...
Java 基础(4)—Java 对象布局及偏向锁、轻量锁、重量锁介绍
一、Java 对象内存布局 1、对象内存布局 一个对象在 Java 底层布局(右半部分是数组连续的地址空间),如下图示: 总共有三部分总成: 1. 对象头:储对象的元数据,如哈希码、GC 分代年龄、锁状态…...
Flink回撤流详解 代码实例
一、概念介绍 1. 回撤流的定义 在 Flink 中,回撤流主要出现在使用 Table API 或 SQL 进行聚合或更新操作时。对于那些结果并非单纯追加(append-only)的查询,Flink 会采用“回撤流”模式来表达更新。 回撤流的数据格式ÿ…...
Glowroot 是一个开源的 Java 应用性能监控(APM)工具,专为 低开销、易用性 设计,具体的应用及优势进行分析说明
Glowroot 是一个开源的 Java 应用性能监控(APM)工具,专为 低开销、易用性 设计,适用于开发和生产环境。它可以帮助你实时监控 Java 应用的性能指标(如响应时间、SQL 查询、JVM 状态等),无需复杂配置即可快速定位性能瓶颈。 1. 核心功能 功能说明请求性能分析记录 HTTP 请…...
台式电脑插入耳机没有声音或麦克风不管用
目录 一、如何确定插孔对应功能1.常见音频插孔颜色及功能2.如何确认电脑插孔?3.常见问题二、 解决方案1. 检查耳机连接和设备选择2. 检查音量设置和静音状态3. 更新或重新安装声卡驱动4. 检查默认音频格式5. 禁用音频增强功能6. 排查硬件问题7. 检查系统服务8. BIOS设置(可选…...
直播电商革命:东南亚市场的“人货场”重构方程式
一、人设经济3.0:从流量收割到情感基建 东南亚直播战场正经历从"叫卖式促销"到"沉浸式信任"的质变,新加坡市场成为最佳观察样本: 数据印证趋势:Shopee直播用户日均停留28分钟,超短视频平台&#…...
AI图像生成
要通过代码实现AI图像生成,可以使用深度学习框架如TensorFlow、PyTorch或GANs等技术。下面是一个简单的示例代码,演示如何使用GANs生成手写数字图像: import torch import torchvision import torchvision.transforms as transforms import …...
Spring Boot 通过全局配置去除字符串类型参数的前后空格
1、问题 避免前端输入的字符串参数两端包含空格,通过统一处理的方式,trim掉空格 2、实现方式 /*** 去除字符串类型参数的前后空格* author yanlei* since 2022-06-14*/ Configuration AutoConfigureAfter(WebMvcAutoConfiguration.class) public clas…...
【AI论文】OLMoTrace:将语言模型输出追溯到万亿个训练标记
摘要:我们提出了OLMoTrace,这是第一个将语言模型的输出实时追溯到其完整的、数万亿标记的训练数据的系统。 OLMoTrace在语言模型输出段和训练文本语料库中的文档之间找到并显示逐字匹配。 我们的系统由扩展版本的infini-gram(Liu等人…...
git仓库迁移包括提交记录日志
网上找了很多资料都不好用,直到看到一个亲测有效后,整理如下: 1、进入仓库目录下,并且切换到要迁移的分支上 前提是你本地已有旧仓库的代码;如果没有的话,先拉取。 2、更改仓库地址 git remote set-url …...
SAP GUI 显示SAP UI5应用,并实现SSO统一登陆
想用SAP UI5 做一写界面,又不想给用户用标准的Fiori APP怎么办?我觉得可以用可配置物料标准功能的思路,在SAP GUI中显示UI5界面,而不是跳转到浏览器。 代码实现后的效果如下: 1、调用UI5应用,适用于自开发…...
HumanDil-Ox-LDL:保存:2-8℃保存,避免强光直射,不可冻存
化学试剂的基本介绍: /// 英文名称:HumanDil-Oxidized LowDensityLipoprotein /// 中文名称:人源红色荧光标记氧化型低密度脂蛋白 /// 浓度:1.0-4.0 mg/ml /// 外观:乳状液体 /// 缓冲液组分:PBS&…...
开箱即用!推荐一款Python开源项目:DashGo,支持定制改造为测试平台!
大家好,我是狂师。 市面上的开源后台管理系统项目层出不穷,对应所使用到的技术栈也不尽相同。 今天给大家推荐一款开源后台管理系统: DashGo,不仅部署起来非常的简单,而且它是基于Python技术栈实现的,使得基于它进行…...
JS小练习0.1——弹出姓名
分析:1.用户输入 2.内部处理保存数据 3.打印输出 <body><script>let name prompt(输入你的名字)document.write(name)</script> </body>...
vue自定义颜色选择器
vue自定义颜色选择器 效果图: step0: 默认写法 调用系统自带的颜色选择器 <input type"color">step1:C:\Users\wangrusheng\PycharmProjects\untitled18\src\views\Home.vue <template><div class"container"><!-- 颜…...
LibreOffice Writer使用01去除单词拼写判断的红色下划线
这个软件还是非常有特色的,因为大家需要office的全部功能,常常忽略了这个软件的使用体验。 csdn不是特别稳定,linux也没有什么比较好的md编辑器,所以我选择这个软件来记录我的临时博客,原因无他,它可以保存…...
0401react中使用css-react-css-仿低代码平台项目
文章目录 1、普通方式-内联使用css2、引入css文件2.1、示例2.2、classnames 3、内联css与引入css文件对比3.1、内联css3.2、 外部 CSS 文件(External CSS) 4、css module5、sass6、classnames组合scss modules7、css-in-js7.1、CSS-in-JS 的核心特性7.2、…...
Devops之GitOps:什么是Gitops,以及它有什么优势
GitOps 定义 GitOps 是一种基于版本控制系统(如 Git)的运维实践,将 Git 作为基础设施和应用程序的唯一事实来源。通过声明式配置,系统自动同步 Git 仓库中的期望状态到实际运行环境,实现持续交付和自动化运维。其核心…...
蓝桥杯真题-危险系数DF
抗日战争时期,冀中平原的地道战曾发挥重要作用。 地道的多个站点间有通道连接,形成了庞大的网络。但也有隐患,当敌人发现了某个站点后,其它站点间可能因此会失去联系。 我们来定义一个危险系数DF(x,y): 对于两个站点x和…...
《线性表、顺序表与链表》教案(C语言版本)
🌟 各位看官好,我是maomi_9526! 🌍 种一棵树最好是十年前,其次是现在! 🚀 今天来学习C语言的相关知识。 👍 如果觉得这篇文章有帮助,欢迎您一键三连,分享给更…...
[ctfshow web入门] web33
信息收集 相较于上一题,这题多了双引号的过滤。我猜测这一题的主要目的可能是为了不让使用$_GET[a]之类的语句,但是$_GET[a]也是一样的 没有括号可以使用include,没有引号可以使用$_GET 可以参考[ctfshow web入门] web32,其中的所…...
三、TorchRec中的Optimizer
TorchRec中的Optimizer 文章目录 TorchRec中的Optimizer前言一、嵌入后向传递与稀疏优化器融合如下图所示:二、上述图片的关键步骤讲解:三、优势四、与传统优化器对比总结 前言 TorchRec 模块提供了一个无缝 API,用于在训练中融合后向传递和…...
C++算法之代码随想录(链表)——基础知识
(1)什么是链表 链表是一种线性数据结构。常见的单链表由两部分组成,value(存储节点的值)和next(存储指向下一个节点地址的指针)。链表的头节点称为head。创建链表一般使用结构体(str…...
oracle update 原理
Oracle 11g 中的 UPDATE 操作是数据库修改数据的关键机制,其核心原理涉及事务管理、多版本并发控制(MVCC)、Undo/Redo 日志、锁机制等 1. 执行前的准备 SQL 解析与执行计划: Oracle 解析 UPDATE 语句,生成执行计划&…...
蓝桥杯 15g
班级活动 问题描述 小明的老师准备组织一次班级活动。班上一共有 nn 名 (nn 为偶数) 同学,老师想把所有的同学进行分组,每两名同学一组。为了公平,老师给每名同学随机分配了一个 nn 以内的正整数作为 idid,第 ii 名同学的 idid 为…...
webrtc pacer模块(一) 平滑处理的实现
Pacer起到平滑码率的作用,使发送到网络上的码率稳定。如下的这张创建Pacer的流程图,其中PacerSender就是Pacer,其中PacerSender就是Pacer。这篇文章介绍它的核心子类PacingController及Periodic模式下平滑处理的基本流程。平滑处理流程中还有…...
基于角色个人的数据权限控制
一、适用场景 如何有效控制用户对特定数据的访问和操作权限,以确保系统的安全性和数据的隐私性。 二、市场现状 权限管理是现代系统中非常重要的功能,尤其是对于复杂的B端系统或需要灵活权限控制的场景,可以运用一些成熟的工具和框架&…...
