7张图,带你5分钟入门RocketMQ

RocketMq快速入门(详解) rocketmq安装以及代码实例全套 阅读详情

RocketMQ 是阿里巴巴的分布式消息中间件,在 2012 年开源,在 2017 年成为 Apache 顶级项目。

1 集群架构

RocketMQ 的集群架构如下图:

从上图可以看到,整个集群中有四个角色:Name Server集群、Broker主从集群、Producer、Consumer。

1.1 Name Server 集群

Name Server 集群部署,但是节点之间并不会同步数据,因为每个节点都会保存完整的数据。因此单个节点挂掉,并不会对集群产生影响。

1.2 Broker

Broker 采用主从集群,实现多副本存储和高可用。每个 Broker 节点都要跟所有的 Name Server 节点建立长连接,定义注册 Topic 路由信息和发送心跳。

跟所有 Name Server 建立连接,就不会因为单个 Name Server 挂了影响 Broker 使用。Broker 主从模式中, Slave 节点主动从 Master 节点拉取消息。

1.3 Producer

Producer 跟 Name Server 的任意一个节点建立长连接,定期从 Name Server 拉取 Topic 路由信息。Producer 是否采用集群,取决于它所在的业务系统。

1.4 Consumer

Consumer 跟 Name Server 的任意一个节点建立长连接,定期从 Name Server 拉取 Topic 路由信息。Consumer 是否采用集群,取决于它所在的业务系统。

Producer 和 Consumer 只跟任意一个 Name Server 节点建立连接,因为 Broker 会向所有 Name Server 注册 Topic 信息,所以每个 Name Server 保存的数据其实是一致的。

2 MessageQueue

Producer 发送的消息会在 Broker 的 MessageQueue 中保存,当然,MessageQueue 并不保存物理消息,而是保存消息的偏移量,详见第 5 节。如下图:

有了 MessageQueue ,Topic 的消息就可以在 Broker 中实现分布式存储,如上图,Broker 集群中有 3 个 Broker,保存两个 Topic 的消息。每个 Broker 为 Topic 创建 4 个MessageQueue。

有了 MessageQueue,Producer 可以并发地向 Broker 中发送消息,Consumer 也可以并发地消费消息。

3 Consumer

RocketMQ的消费模式如下图:

图中,RocketMQ 集群中有两个 Broker,每个 Broker 上有 4 个 MessageQueue,Topic1 的消息并发写入了这 8 个 MessageQueue。

RocketMQ 通过 Consumer Group1 这个消费者组进行消息拉取。

一个消费者可以消费多个 MessageQueue,但是同一个 MessageQueue 只能被同一个消费者组的一个消费者消费。比如  MessageQueue0 只能被 Consumer Group1 中的 Consumer1 消费, 不能被其他消费者消费。

4 Broker 高可用集群

Broker 集群如下图:

Broker 通过主从集群来实现消息高可用。跟 Kafka 不同的是,RocketMQ 并没有 Master 节点选举功能,而是采用多 Master 多Slave 的集群架构。Producer 写入消息时写入 Master 节点,Slave 节点主动从 Master 节点拉取数据来保持跟 Master 节点的数据一致。

Consumer 消费消息时,既可以从 Master 节点拉取数据,也可以从 Slave 节点拉取数据。到底是从 Master 拉取还是从 Slave 拉取取决于 Master 节点的负载和 Slave 的同步情况。如果 Master 负载很高,Master 会通知 Consumer 从 Slave 拉取消息,而如果 Slave 同步消息进度延后,则 Master 会通知 Consumer 从 Master 拉取数据。总之,从 Master 拉取还是从 Slave 拉取由 Master 来决定。

如果 Master 节点发生故障,RocketMQ 会使用基于 raft 协议的 DLedger 算法来进行主从切换。

Broker 每隔 30s 向 Name Server 发送心跳,Name Server 如果 120s 没有收到心跳,就会判断 Broker 宕机了。

5 消息存储

RocketMQ 的存储设计是非常有创造性的。存储文件主要有三个:CommitLog、ConsumeQueue、Index。如下图:

5.1 CommitLog

RocketMQ 的消息保存在 CommitLog 中,CommitLog 每个文件 1G 大小。有趣的是,文件名并不叫 CommitLog,而是用消息的偏移量来命名。比如第一个文件文件名是 0000000000000000000,第二个文件文件名是 00000000001073741824,依次类推就可以得到所有文件的文件名。

有了上面的命名规则,给定一个消息的偏移量,就可以根据二分查找快速找到消息所在的文件,并且用消息偏移量减去文件名就可以得到消息在文件中的偏移量。

RocketMQ 写 CommitLog 时采用顺序写,大大提高了写入性能。

5.2 ConsumeQueue

如果直接从 CommitLog 中检索 Topic 中的一条消息,效率会很低,因为需要从文件的第一条消息开始依次查找。引入了 ConsumeQueue 作为 CommitLog 的索引文件,会让检索效率大增。

刚开始不理解 ConsumeQueue 和 MessageQueue 的区别,网上查了一些资料发现,每个ConsumeQueue对应一个上面介绍的 MessageQueue,MessageQueue 只是一个概念模型。

ConsumeQueue 中的元素内容如下:

  • 前 8 个字节记录消息在 CommitLog 中的偏移量。

  • 中间 4 个字节记录消息消息大小。

  • 最后 8 个字节记录消息中 tag 的 hashcode。

这个 tag 的作用非常重要,假如一个 Consumer 订阅了 TopicA,Tag1 和 Tag2,那这个 Consumer 的订阅关系如下图:

可以看到,这个订阅关系是一个 hash 类型的结构,key 是 Topic 名称,value 是一个 SubscriptionData 类型的对象,这个对象封装了 tag。

拉取消息时,首先从 Name Server 获取订阅关系,得到当前 Consumer 所有订阅 tag 的 hashcode 集合 codeSet,然后从 ConsumerQueue 获取一条记录,判断最后 8 个字节 tag hashcode 是否在 codeSet 中,以决定是否将该消息发送给Consumer。

5.3 Index 文件

RocketMQ 支持按照消息的属性查找消息,为了支持这个功能,RocketMQ 引入了 Index 索引文件。Index 文件有三部分组成,文件头 IndexHead、500万个 hash 槽和 2000 万个 Index 条目组成。

5.3.1 IndexHead

总共有 6 个元素组成,前两个元素表示当前这个 Index 文件中第一条消息和最后一条消息的落盘时间,第三、第四两个元素表示当前这个 Index 文件中第一条消息和最后一条消息在 CommitLog 文件中的物理偏移量,第五个元素表示当前这个 Index 文件中 hash 槽的数量,第六个元素表示当前这个 Index 文件中索引条目的个数。

查找的时候除了传入 key 还需要传入第一条消息和最后一条消息的落盘时间,这是因为 Index 文件名是时间戳命名的,传入落盘时间可以更加精确地定位 Index 文件。

5.3.2 Hash 槽

熟悉 Java 中 HashMap 的同学应该都比较熟悉 Hash 槽这个概念了,其实就是 Hash 结构的底层数组。Index 文件中的 Hash 槽有 500 万个数组元素,每个元素是 4 个字节 int 类型元素,保存当前槽下最新的那个 index 条目的序号。

这里 Hash 槽解决 Hash 冲突的方式是链表法,如下图:

5.3.3 Index 条目

每个 Index 条目中,key 的 hashcode 占 4 个字节,phyoffset 表示消息在 CommitLog 中的物理偏移量占 8 个字节,timediff  表示消息的落盘时间与 header 里的 beginTimestamp 的差值占 4 个字节,pre index no 占 4 个字节。

pre index no 保存的是当前的 Hash 槽中前一个 index 条目的序号,一般在 key 发生 Hash 冲突时才会有值,否则这个值就是 0,表示当前元素是 Hash 槽中第一个元素。

Index 条目中保存 timediff,是为了防止 key 重复。查找 key 时,在 key 相同的情况下, 如果传入的时间范围跟 timediff 不满足,则会查找 pre index no 这个条目。

5.3.4 本节总结

通过上面的分析,我们可以总结一个通过 key 在 Index 文件中查找消息的流程,如下:

1.计算 key 的 hashcode;

2.根据 hashcode 在 Hash 槽中查找位置 s;

3.计算 Hash 槽在 Index 文件中位置 40+(s-1)*4;

4.读取这个槽的值,也就是Index条目序号 n;

5.计算该 index 条目在 Index 文件中的位置,公式:40 + 500万 * 4 + (n-1) * 20;

6.读取这个条目,比较 key 的 hashcode 和 index 条目中 hashcode是否相同,以及 key 传入的时间范围跟 Index 条目中的 timediff 是否匹配。如果条件不符合,则查找 pre index no 这个条目,找到后,从 CommitLog 中取出消息。

6 刷盘策略

Rocket MQ 采用灵活的刷盘策略。

6.1 异步刷盘

消息写入 CommitLog 时,并不会直接写入磁盘,而是先写入PageCache 缓存中,然后用后台线程异步把消息刷入磁盘。异步刷盘策略就是消息写入 PageCache  后立即返回成功,这样写入效率非常高。如果能容忍消息丢失,异步刷盘是最好的选择。

6.2 同步刷盘

即使同步刷盘,RocketMQ 也不是每条消息都要刷盘,线程将消息写入内存后,会请求刷盘线程进行刷盘,但是刷盘线程并不会只把当前请求的消息刷盘,而是会把待刷盘的消息一同刷盘。同步刷盘策略保证了消息的可靠性,但是也降低了吞吐量,增加了延迟。

7 总结

本文用 7 张图总结了 RocketMQ 的核心知识,希望能带你快速入门。

更多技术交流,关注我公众号

 

RocketMQ进阶-延时消息 小编也是很有感触,如果一直都是在中小公司,没有接触过大型的互联网架构设计的话,只靠自己看书去提升可能一辈子都很难达到高级架构师的技术和认知高度。向厉害的人去学习是最有效减少时间摸索、精力浪费的方式。我们选择的这个行业就一直要持续的学习,又很吃青春饭。虽然大家可能经常见到说程序员年薪几十万,但这样的人毕竟不是大部份,要么是有名校光环,要么是在阿里华为这样的大企业。年龄一大,更有可能被裁。送给每一位想学习Java小伙伴,用来提升自己。 阅读详情

相关推荐

【福建dem】原始高程数据tif格式

DEM(Digital Elevation Model,数字高程模型)是一种地理信息系统中的关键数据集,它提供了地表地形的三维信息,通常用于分析地貌特征、模拟水文过程、规划建设、灾害预警等多个领域。这种数据对于地理分析非常有价值,例如,它可以用于计算坡度、坡向、地形粗糙度等地形特征,或者进行洪水模拟、地质灾害评估、太阳能辐射分析等。“福建dem原始高程数据tif格式”是研究和理解福建省地形地貌的重要资源,结合GIS工具,可以揭示丰富的地理信息,为科研、工程和决策提供有力支持。

鸿业远图科技 943

RocketMQ入门教程

RocketMQ是一款简单易上手的消息队列中间件,本文详细介绍了RocketMQ的基础使用流程,基础操作流程,对新手进行消息队列的学习具有很大的帮助。

wywcool的博客 5253

基于DBSCAN聚类算法的超像素实时分割

Real-Time Superpixel Segmentation by DBSCAN Clustering Algorithm 摘要 在本文中,我们提出了一种基于密度的带噪声应用空间聚类(DBSCAN)算法的50帧/秒实时图像超像素分割方法。为了降低超像素算法的计算量,我们采用了一种快速的两步框架。在第一个聚类阶段,使用具有颜色相似性和几何约束的DBSCAN算法对像素进行快速聚类,然后在第二个合并阶段,通过颜色和空间特征定义的距离度量,将小簇按其邻域合并为超像素。为了在这两个步骤中获得更好的超像素,定义了

yttt的博客 3492

RocketMQ的快速入门

学习一下RocketMQ的快速入门,RocketMQ的概念,RocketMQ的代码实现

人生的尽头是孤独 1248

使用gsplat进行3D高斯泼溅的方案

gsplat 不是一个软件,而是一个深度优化CUDA的开源Python库。它的作者是 Nerfstudio 团队,这个团队最出名的项目是 Nerfstudio,是对 NeRFs 方法支持最好的一套框架。据其所述,出于对新一代技术的好奇,他们构建了 gsplat 这个库。它支持 Windows/Linux 两个系统,使用前必须准备好 Nvidia 显卡。跑这个项目真是特别费劲,官方的文档支持不够完善,以至于遇到问题,开发者们都只能在issue区里抱团取暖。

兴趣使然的创作者 2106

5、数字图像采集:X射线成像技术全解析

本文全面解析了数字图像采集中的X射线成像技术,涵盖数字X射线探测器、荧光透视与血管造影、乳腺摄影以及计算机断层扫描(CT)的图像重建原理。详细介绍了TFT平板探测器的优势、DSA技术在血管成像中的应用、乳腺摄影对高对比度和分辨率的需求,以及CT中基于Radon变换和滤波反投影的重建方法。同时探讨了噪声、部分容积效应、金属伪影和运动伪影等常见问题及其影响。最后总结了各类X射线成像技术的特点与应用场景,并展望了未来在图像质量提升和剂量优化方面的技术发展方向。

l6m7n8的博客 128

RocketMQ快速入门

RocketMQ代码入门

weixin_43660088的博客 1034

Claude Code 分布式并行开发最佳实践:1中枢+10Worker跨多Git仓库全流程落地

本文介绍了一套基于Claude Code和Git Worktree的分布式并行开发方案,解决多仓库、微服务开发中的核心痛点。方案采用"1个决策中枢+10个并行Worker"架构,中枢负责任务拆解和调度,每个Worker绑定独立仓库实现完全隔离开发。关键优势包括:任务并行效率提升10倍、跨仓库依赖自动编排、版本统一管理、零第三方依赖。文章详细提供了环境准备、架构设计、中枢搭建和初始化脚本等全流程落地指南,特别适合多仓库协同的全栈开发场景。

AI天才研究院 244

RocketMQ新手教程:一文带你全面快速入门

一篇文章快速入门RocketMQ的安装、消息发送、消息消费

weixin_53818428的博客 3579

tsmc12:via0的spacing问题(Via0.S.1)

12nm有个via0 grid的概念,除了普通fill外,基本都有via0这一层,这一层需要与via0 grid对齐。手动调整cell的位置比较容易出这个drc,比如修m0po max length drc时。解决方法1: 替换EEQV类型cell,这种类型是专门为了修via0 Grid问题存在的。更多学习内容请关注「拾陆楼」知识星球。解决方法2: 翻转或移动。

m0_61544122的博客 1115

电磁场仿真:电磁场基础理论_(13).微波技术基础

微波是指频率在300 MHz到300 GHz之间的电磁波。这一频率范围对应的波长为1米到1毫米。

2401_87715305的博客 1318

SprigBoot整合rocketmq-v5-client-spring-boot(RocketMQ5.0+)

rocketmq-v5-client-spring-boot 示例 RocketMQClientTemplate 使用

weixin_42116127的博客 4305

[Dify实战] Bug 自动归因与复现指南生成器-带绑定资源

摘要: 本文介绍如何利用Dify构建"Bug自动归因与复现指南生成器",解决研发测试中的常见痛点。该系统可自动解析Bug信息,结构化输出复现步骤、可能原因、修复建议和回归测试点,显著提升问题处理效率。文章详细阐述了方案流程、Prompt设计要点、输出模板及落地清单,并提供了RCA分析模板和标准复现步骤示例。通过统一Bug描述模板和自动化分析,该系统能有效降低人力成本,加速问题闭环,适用于持续迭代的中大型项目。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 294

RocketMQ吐血总结

RocketMQ吐血总结 架构   概念模型 最基本的概念模型与扩展后段概念模型  存储模型   RocketMQ吐血总结 User Guide RocketMQ是一款分布式消息中间件,最初是由阿里巴巴消息中间件团队研发并大规模应用于生产系统,满足线上海量消息堆积的需求, 在2016年底捐赠给Apache开源基金会成为孵化项目,经过不到一年时间正式成为了A...

武汉红喜 15万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

10分钟认识RocketMQ,想进阿里连这个都不会?

学习视频:《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!//1.创建消费者Consumer,制定消费者组名//2.指定Nameserver地址//3.订阅主题Topic和Tag//4.注册消息监听器@OverrideSystem.out.println(“线程名称:【” + Thread.currentThread().getName() + “】:” + new String(msg.getBody()));});

2401_84097520的博客 867

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

10分钟认识RocketMQ!想进阿里连这个都不会?

看完美团、字节、腾讯这三家的一二三面试问题,是不是感觉问的特别多,可能咱们真的又得开启面试造火箭、工作拧螺丝的模式去准备下一次的面试了。开篇有提及我可是足足背下了Java互联网工程师面试1000题,多少还是有点用的呢,换汤不换药,不管面试官怎么问你,抓住本质即可!能读到此处的都是真爱Java互联网工程师面试1000题。

2401_84414832的博客 1247

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

RocketMQ第7讲——延迟消息实现原理

上面我们讲过,RocketMQ 4.x发送延迟消息的时候,会先把消息暂存到一个中间队列,然后扫描是否到期,到期后才会被投递到真正的Topic中,这个方案的局限性就是每个队列的延迟时间必须是相同的。假如支持任意消息也用队列的方式存的话,如果队头的消息延迟时间比较长,就会阻塞住后面的消息投递,久而久之延迟队列长度就会越来越大。Broker接收延迟消息,他需要控制没到时间的消息不会被消费者消费到,但是消息的量级可能很大(十万、百万、千万),一条消息对应一个”闹钟“的管理机制,神仙来了也扛不住。

让~学习~成为一种习惯(橡 皮 人の技术博客) 2766

5分钟搭建rocketmq 4.8集群

5分钟搭建rocketmq 4.8集群

fsckzyly的博客 1927
上一篇: ThreadLocal夺命11连问
下一篇: 几乎包含了所有Java技术栈.面试手册pdf|高清下载
跟着我学Java
博客等级 码龄6年 660粉丝 1341原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值