全网最详细的 RocketMQ 源码解读方案(上)赶紧收藏

消息中间件-RocketMQ(基础、实战、源码、原理看这一篇就够了) 消息中间件和消息队列是同一个概念的两种名称,是分布式系统中的一个重要组件。举个例子:比如现在有一个商城系统使用的是微服务架构,其中有订单服务、库存服务、物流服务、积分服务。业务场景是如果下单了一个商品需要调用库存服务减库存、需要调用物流服务发送商品、需要调用积分服务添加响应的积分。通过RPC框架(也就是http请求)通过消息中间件消息中间件就是生产者只需要将需要处理的消息丢进来即可不需要等到消息执行完成的回调,然后其他服务再去监听消息,有消息来了就执行消息消息中间件的应用场景异步解耦。 阅读详情

我们开始深入RocketMQ的源码。源码的解读是个非常困难的过程,每个人的理解程度都会不一样,也不太可能通过讲解把其中的细节全部讲明白。我们今天在解读源码时,采取逐层抽取的模式,希望能够给大家形成一个源码解读的大框架,帮助大家对源码形成自己的理解。

我们分为几条主线来解读源码:

源码环境搭建

1、源码拉取

RocketMQ的官方Git仓库地址:https://github.com/apache/rocketmq 可以用git把项目clone下来或者直接下载代码包。

也可以到RocketMQ的官方网站上下载指定版本的源码:http://rocketmq.apache.org/dowloading/releases/ 

下载后就可以解压导入到IDEA中进行解读了。我们只要注意下是下载的4.7.1版本就行了。

源码下很多的功能模块,很容易让人迷失方向,我们只关注下几个最为重要的模块:

  • broker: broker 模块(broke 启动进程)

  • client :消息客户端,包含消息生产者、消息消费者相关类

  • example: RocketMQ 例代码

  • namesrv:NameServer实现相关类(NameServer启动进程)

  • store:消息存储实现相关类

各个模块的功能大都从名字上就能看懂。我们可以在有需要的时候再进去看源码。

但是这些模块有些东西还是要关注的。例如docs文件夹下的文档,以及各个模块下都有非常丰富的junit测试代码,这些都是非常有用的。

2、注解版源码引入

RocketMQ的源码中有个非常让人头疼的事情,就是他的代码注释几乎没有。为了帮助大家解读源码,我给大家准备了一个添加了自己注释的源码版本。在配套资料当中。大家可以把这个版本导入IDEA来进行解读。

源码中对最为重要的注解设定了一个标记K1,相对不那么重要的注解设定了一个标记K2,而普通的注释就没有添加标记。大家可以在IDEA的TODO标签中配置这两个注解标记。                  

3、源码调试

将源码导入IDEA后,需要先对源码进行编译。

编译指令 clean install -Dmaven.test.skip=true     

编译完成后就可以开始调试代码了。调试时需要按照以下步骤:调试时,先在项目目录下创建一个conf目录,并从distribution拷贝broker.conf和logback_broker.xml和logback_namesrv.xml 

          

         

注解版源码中已经复制好了。

3.1 启动nameServer

展开namesrv模块,运行NamesrvStartup类即可启动NameServer

启动时,会报错,提示需要配置一个ROCKETMQ_HOME环境变量。这个环境变量我们可以在机器上配置,跟配置JAVA_HOME环境变量一样。也可以在IDEA的运行环境中配置。目录指向源码目录即可。   

       

                       

配置完成后,再次执行,看到以下日志内容,表示NameServer启动成功

The Name Server boot success. serializeType=JSON

3.2 启动Broker

启动Broker之前,我们需要先修改之前复制的broker.conf文件

 brokerClusterName = DefaultCluster
 brokerName = broker-a
 brokerId = 0
 deleteWhen = 04
 fileReservedTime = 48
 brokerRole = ASYNC_MASTER
 flushDiskType = ASYNC_FLUSH
 
 # 自动创建Topic
 autoCreateTopicEnable=true
 # nameServ地址
 namesrvAddr=127.0.0.1:9876
 # 存储路径
 storePathRootDir=E:\\RocketMQ\\data\\rocketmq\\dataDir
 # commitLog路径
 storePathCommitLog=E:\\RocketMQ\\data\\rocketmq\\dataDir\\commitlog
 # 消息队列存储路径
 storePathConsumeQueue=E:\\RocketMQ\\data\\rocketmq\\dataDir\\consumequeue
 # 消息索引存储路径
 storePathIndex=E:\\RocketMQ\\data\\rocketmq\\dataDir\\index
 # checkpoint文件路径
 storeCheckpoint=E:\\RocketMQ\\data\\rocketmq\\dataDir\\checkpoint
 # abort文件存储路径
 abortFile=E:\\RocketMQ\\data\\rocketmq\\dataDir\\abort

然后Broker的启动类是broker模块下的BrokerStartup。

启动Broker时,同样需要ROCETMQ_HOME环境变量,并且还需要配置一个-c 参数,指向broker.conf配置文件。       

然后重新启动,即可启动Broker。

3.3 发送消息

在源码的example模块下,提供了非常详细的测试代码。例如我们启动example模块下的org.apache.rocketmq.example.quickstart.Producer类即可发送消息。

但是在测试源码中,需要指定NameServer地址。这个NameServer地址有两种指定方式,一种是配置一个NAMESRV_ADDR的环境变量。另一种是在源码中指定。我们可以在源码中加一行代码指定NameServer

 producer.setNamesrvAddr("127.0.0.1:9876");

然后就可以发送消息了。

3.4 消费消息

我们可以使用同一模块下的org.apache.rocketmq.example.quickstart.Consumer类来消费消息。运行时同样需要指定NameServer地址

 consumer.setNamesrvAddr("192.168.232.128:9876");

这样整个调试环境就搭建好了。

3.5 如何看源码

下面我们可以一边调试一边讲解源码了。源码中大部分关键的地方都已经添加了注释,文档中就不做过多记录了。

我们在看源码的时候,要注意,不要一看源码就一行行代码都逐步看,更不要期望一遍就把代码给看明白。这样会陷入到代码的复杂细节中,瞬间打击到放弃。

看源码时,需要用层层深入的方法。每一次阅读源码时,先了解程序执行的流程性代码,略过服务实现的细节性代码,形成大概的概念框架。然后再回头按同样的方法,逐步深入到之前略过的代码。这样才能从源码中看出一点门道来。如果你对源码感兴趣的话,可以添加名片大家一起学习交流下,另外还准备了一份学习资料送给大家,备注“222”即可领取。

RocketMQ04-源码解读 文章目录一、源码环境搭建1、源码拉取:2、注解版源码引入3、源码调试:3.1 启动nameServer3.2 启动Broker3.3 发送消息3.4 消费消息3.5 如何看源码二、NameServer启动1、功能回顾2、启动流程3、源码重点三、Broker启动1、功能回顾2、源码重点四、Broker注册1、功能回顾2、源码重点五、Producer1、功能回顾2、源码重点六、消息存储1、功能回顾2、源码重点:七、消费者1、功能回顾2、源码重点:八、延迟消息1、功能回顾2、源码重点3 消费者部分小结:源码解读小 阅读详情

相关推荐

轻松解读RocketMQ5.3.0核心源码

同步刷盘,异步刷盘?同步同步,异步同步?零拷贝,顺序写?你是不是曾经在各种各样的流量短视频和博客中听说过跟RocketMQ相关的这些亮瞎眼的高大上的技术名词?你有没有想过自己去RocketMQ中看看这些概念背后的Java代码是什么样的?如果你有过这样的想法,那么,楼兰到你到RocketMQ的源码当中逛逛,看看RocketMQ的大神们,是如何用简单常见的MVC思想开发出RocketMQ这样的神作的。

roykingw的专栏 1549

RocketMQ源码分析

RocketMQ源码分析

lx9876lx的博客 8282

RocketMq源码解析一:源码结构介绍

从本章开始我们对Rocketmq的源码进行解析。使用版本是4.9.8。

money9sun的博客 598

全网最详细的 RocketMQ 源码解读方案(下)赶紧收藏

一、启动 DefaultMQPushConsumer.start方法 启动过程不用太过关注,有个概念就行,然后客户端启动的核心是 mQClientFactory 主要是启动了一大堆的服务。这些服务可以结合具体场景再进行深入。例如pullMessageService主要处理拉取消息服务,rebalanceService主要处理客户端的负载均衡。 二、消息拉取 拉模式:PullMessageService PullRequest里有messageQueue和processQueue,其中message

java_121388的博客 1224

【文本分析学习】Anaconda+pytorch虚拟环境下的pycharm文本分析(含分词、词性标注、词形归一化、停用词、文本情感分析、词频、文本相似度,附数据代码) NLTK

文本分析学习之 Anadconda+pytorch虚拟环境下的pycharm文本分析(含分词、词性标注、词形归一化、停用词、文本情感分析、词频、文本相似度,附数据代码)

littlexmj的博客 2333

MySQL 8.0数据库崩了别慌!手把手教你仅凭一个.ibd文件找回数据(附Go工具包)

本文详细介绍了在MySQL 8.0数据库崩溃后,如何仅凭.ibd文件恢复数据的完整流程。通过使用Go语言工具包和ALTER TABLE技巧,即使没有备份也能实现数据重生。文章包含从环境准备到数据验证的全方位指导,帮助DBA和开发者应对紧急数据恢复场景。

weixin_29235923的博客 421

RocketMQ的下载与安装(全网最细保姆级别教学)

RocketMQ的下载与安装(全网最细保姆级别教学)

舒一笑的博客 2万+

AGI 之 【Dify】 之 Dify 在 Windows 端本地部署调用 Ollama 本地下载的大模型, API 形式 Python 调用 进行简单聊天接口测试

AGI,即通用人工智能(Artificial General Intelligence),是一种具备人类智能水平的人工智能系统。它不仅能够执行特定的任务,而且能够理解、学习和应用知识于广泛的问题解决中,具有较高的自主性和适应性。AGI的能力包括但不限于自我学习、自我改进、自我调整,并能在没有人为干预的情况下解决各种复杂问题。本节将介绍如何使用 Dify 平台调用 Ollama 部署的本地模型来创建一个聊天应用。通过 API 的方式发起聊天,可以让前端自由布置所需的聊天形式。

仙魁XAN 1万+

04-RocketMQ源码解读

04-RocketMQ源码解读

Joanna_or_zhouzhou的博客 893

Odoo 集成ReportBro报表设计器支持13,14,15,16,17,18,19

Odoo 集成ReportBro零代码报表设计器,ReportBro设计器 一个用于创建PDF和XLSX报告模板的javascript插件。

zxltwins的博客 3380

倍福 MODBUS TCP/IP通信

(*默认字符串80字节,此处声明为255字节,可以一次性传42个UINT数据.5位整数加一个空格,即每个数据6字节*)(*---------------------------------------- 以下为用户程序 ----------------------------------------*)(*读回并换算后的值*)(*准备写到PLC的值*)(*用于比较两次读回的值相差多少,以估计通讯的速度, Act_CalcDiff*)(*用于切换读和写,Act_Protocal*)

qq_33280096的博客 1367

RocketMQ核心源码解读(一)

RocketMQ的通信是长连接双向的,使用REQUEST__COMMAND 和 RESPONSE_COMMAND来判断是什么类型的连接,客户端向服务端请求就是REQUEST__COMMAND,服务端接着会发送RESPONSE_COMMAND类型到客户端,客户端做回调(异步操作)可以在生产者示例中,start后打⼀个断点,然后把NameServer停掉,这时,Producer还是可以发送消息的。事务消息的Producer也需要响应Broker的事务状态回查,他也是需要NettyServer的。

weixin_58611042的博客 1437

Java Swing之多文档界面设计-JDesktopPane、JInternalFrame类简单应用示例

Java MDI多文档界面是一种用户界面风格,允许在一个主窗口中包含多个子窗口(文档窗口),每个子窗口可以显示不同的内容或功能模块,从而可以满足用户打开不同窗口完成不同功能的需求。开发多文档程序,一般需要JDesktopPane(桌面面板类)和JInternalFrame(内部窗体类)两个类。以下简单介绍,最后通过一个实例介绍实现逻辑。

编程语言教学工作者的博客 2209

VIP04-RocketMQ源码解读

一、源码环境搭建1、源码拉取:2、注解版源码引入3、源码调试:3.1 启动nameServer3.2 启动Broker3.3 发送消息3.4 消费消息3.5 如何看源码二、NameServer启动1、功能回顾2、启动流程3、源码重点三、Broker启动1、功能回顾2、源码重点四、Broker注册1、功能回顾2、源码重点五、Producer1、功能回顾2、源码重点六、消息存储1、功能回顾2、源码重点:七、消费者1、功能回顾2、源码重点:八、延迟消息1、功能回顾2、源码重点3 消费者部分小结:源码解读小结 ​

liuhehe的博客 579

国债期货的日线趋势跟踪策略实现(基于backtrader框架)

通过backtrader框架,我们可以轻松地实现国债期货的日线趋势跟踪策略,并进行回测和验证。通过这种策略,我们可以尝试捕捉国债期货价格的短期趋势,并根据趋势的方向进行交易决策。backtrader提供了许多内置的指标、订单类型和其他功能,可以帮助你进一步优化和改进你的策略。它提供了丰富的工具和功能,使我们能够快速实现和验证我们的交易想法。方法中,我们根据当前价格和前一天的价格判断趋势的方向,并根据趋势的变化进行买入或卖出操作。然后,我们设置了初始资金和交易手续费,并将我们定义的策略。来跟踪每日的收盘价。

NisyPhilosophy的博客 404

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

四:RocketMQ源码解读

目录 一、源码环境搭建 1、源码拉取: 2、注解版源码引入 3、源码调试: 3.1 启动nameServer 3.2 启动Broker 3.3 发送消息 3.4 消费消息 3.5 如何看源码 二、NameServer启动 1、功能回顾 2、启动流程 3、源码重点 三、Broker启动 1、功能回顾 2、源码重点 四、Broker注册 1、功能回顾 2、源码重点 五、Producer 1、功能回顾 2、源码重点 六、消息存储 1、功能回顾 2、源码重点:.

Xx__WangQi的博客 913

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

rocketmq源码解读-start

原因是需要在配置的ROCKETMQ_HOME变量对应的目录下创建conf/logback-namesrv.xml文件。解决方式:创建conf目录,然后在distribution模块中将logback-namesrv.xml拷贝过去即可。解决方式:创建conf目录,然后在distribution模块中将logback-broker.xml拷贝过去即可。这里就不进行过多讲述了,,感兴趣的可以看看,,后面将会出关于源码运行原理的笔记。原因是需要配置环境变量,变量值可为rocketmq源码的目录地址。

u012690015的博客 880

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

全网最细RocketMQ源码二:Producer

ClientConfig是客户端配置类,继承ClientConfig说白了就是共享一些通用的客户端配置属性和功能。客户端统一rpc:MQClientAPIImpl mQClientAPIImpl,使用他来发送消息的。在sendMessage的过程中一直用到这个类,我们来讲讲这个类是做什么用。创建了requestHeader,带了很多发送message的元数据。客户端与server通信的实现,通过名字就能看得出来。这个就是我们业务层经常使用的对象,用来发送消息。选的时候,用的算法就是一个自增值%队列数目。

一只小星星 1294

RocketMQ学习第一步之源码构建

这里写目录标题绪论源码构建1.clone2. 构建3.配置3.1配置namesrv3.2新建文件夹3.3 配置broker3.4 配置producer3.5 配置 consumer4.启动 绪论 最近溪源在学习dubbo的相关API机制实践,如:负载均衡、服务分组、本地存根等等…一方面是dubbo官网文档给出了详细的介绍和demo,另一方面由于自己时间方面原因(自己现在也需要学习各种技术栈),没有整理相关实践总结。但是后面一定会整理出相关的实践总结。 今天主要给大家介绍一下rocketmq源码本地化构建,也

增量星球 9082

【RocketMQ】第4节|RocketMQ核心源码解读

Producer负载均衡:轮询MessageQueue,支持故障规避和自定义选择器。Consumer负载均衡:集群模式下通过多种算法分配MessageQueue,广播模式下所有消费者获取所有队列。

泽韦德的专栏 669

RocketMQ源码(1)—RocketMQ源码调试环境准备

详细介绍了RocketMQ 4.9.3 分支的源码调试环境搭建等一系列准备工作。

终生学习践行者 3447
上一篇: 低成本,高效率解法:跨平台开发框架!!
下一篇: 全网最详细的 RocketMQ 源码解读方案(下)赶紧收藏
架构文摘JGWZ
博客等级 码龄5年 8808粉丝 345原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值