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

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

一、启动

DefaultMQPushConsumer.start方法

启动过程不用太过关注,有个概念就行,然后客户端启动的核心是 mQClientFactory 主要是启动了一大堆的服务。这些服务可以结合具体场景再进行深入。例如pullMessageService主要处理拉取消息服务,rebalanceService主要处理客户端的负载均衡。

二、消息拉取

拉模式:PullMessageService

PullRequest里有messageQueue和processQueue,其中messageQueue负责拉取消息,拉取到后将消息存入processQueue,进行处理。存入后就可以清空 messageQueue,继续拉取了。       

三、客户端负载均衡策略

在消费者示例的start方法中,启动RebalanceService,这个是客户端进行负载均衡 策略的启动服务。他只负责根据负载均衡策略获取当前客户端分配到的 MessageQueue示例。五种负载策略,可以由Consumer的allocateMessageQueueStrategy属性来选 择。最常用的是AllocateMessageQueueAveragely平均分配和 AllocateMessageQueueAveragelyByCircle平均轮询分配。

平均分配是把MessageQueue按组内的消费者个数平均分配。而平均轮询分配就是把MessageQueue按组内的消费者一个一个轮询分配。

例如,六个队列q1,q2,q3,q4,q5,q6,分配给三个消费者c1,c2,c3

平均分配的结果就是: c1:{q1,q2},c2:{q3,q4},c3{q5,q6}

平均轮询分配的结果就是:c1:{q1,q4},c2:{q2,q5},c3:{q3,q6}

四、并发消费与顺序消费的过程

消费的过程依然是在DefaultMQPushConsumerImpl的 consumeMessageService中。他有两个子类 ConsumeMessageConcurrentlyService和ConsumeMessageOrderlyService。其中最主要的差别是ConsumeMessageOrderlyService会在消费前把队列锁起来, 优先保证拉取同一个队列里的消息。消费过程的入口在DefaultMQPushConsumerImpl的pullMessage中定义的 PullCallback中。

五、延迟消息

功能回顾

我们这里,就用一个典型的延迟消息的流程,来把上面看到的各个组件,结合一 下。

延迟消息的核心使用方法就是在Message中设定一个MessageDelayLevel参数,对应18个延迟级别。然后Broker中会创建一个默认的Schedule_Topic主题,这个主题下有18个队列,对应18个延迟级别。消息发过来之后,会先把消息存入 Schedule_Topic主题中对应的队列。然后等延迟时间到了,再转发到目标队列,推送给消费者进行消费。

整个延迟消息的实现方式是这样的:       

源码重点

延迟消息的处理入口在scheduleMessageService这个组件中。他会在broker启动时也一起加载。

1、消息写入

代码见CommitLog.putMessage方法。

在CommitLog写入消息时,会判断消息的延迟级别,然后修改Message的Topic和 Queue,达到转储Message的目的。

2、消息转储到目标Topic

这个转储的核心服务是scheduleMessageService,他也是Broker启动过程中的一个功能组件、 然后ScheduleMessageService会每隔1秒钟执行一个executeOnTimeup任务,将消息从延迟队列中写入正常Topic中。代码见ScheduleMessageService中的 DeliverDelayedMessageTimerTask.executeOnTimeup方法。这个其中有个需要注意的点就是在ScheduleMessageService的start方法中。有一 个很关键的CAS操作:

if (started.compareAndSet(false, true)) {

这个CAS操作保证了同一时间只会有一个DeliverDelayedMessageTimerTask执行。保证了消息安全的同时也限制了消息进行回传的效率。所以,这也是很多互联网公司在使用RocketMQ时,对源码进行定制的一个重点。

六、消费者部分小结

RocketMQ消息消费方式分别为集群模式、广播模式。

消息队列负载由RebalanceService线程默认每隔20s进行一次消息队列负载,根据当前消费者组内消费者个数与主题队列数量按照某一种负载算法进行队列分配,分配原则为同一个消费者可以分配多个消息消费队列,同一个消息消费队列同一个时间只会分配给一个消费者。

消息拉取由PullMessageService线程根据RebalanceService线程创建的拉取任务进行拉取,默认每次拉取32条消息,提交给消费者消费线程后继续下一次消息拉取。如果消息消费过慢产生消息堆积会触发消息消费拉取流控。并发消息消费指消费线程池中的线程可以并发对同一个消息队列的消息进行消费,消费成功后,取出消息队列中最小的消息偏移量作为消息消费进度偏移量存储在于消息消费进度存储文件中,集群模式消息消费进度存储在Broker(消息服务器), 广播模式消息消费进度存储在消费者端。

RocketMQ不支持任意精度的定时调度消息,只支持自定义的消息延迟级别,例如 1s、2s、5s等,可通过在broker配置文件中设置messageDelayLevel。顺序消息一般使用集群模式,是指对消息消费者内的线程池中的线程对消息消费队列只能串行消费。与并发消息消费最本质的区别是消息消费时必须成功锁定消息消费队列,在Broker端会存储消息消费队列的锁占用情况

七、源码解读小结

关于RocketMQ的源码部分,我们就带大家解读到这里。到目前为止,几个核心的流程我们已经解读完成了,我们按照由大到小,由粗到细的方式对几条主线进行了解读。通过解读源码,我们可以对之前提到的各种高级特性有更深入的理解。对有些有争议的问题,带着问题来源码中找答案是最好的。例如我们经常有人讨论NameServer全部挂了之后,生产者和消费者是否能够用他本地的缓存继续工作一段时间?这样的一些问题,看过源码之后是不是有更清晰的了解?至于其他的代码,大家也可以按照自己的关注点,以业务线的方式来逐步解读。

最后将我们今天解读的部分源码整理成了一个大图,可供参考。截图可能不是很清晰,需要高清图片和学习资料的可以加微信领取,备注“222”

【RocketMQ-Bug】RocketMQ 在使用中的常见问题 1、这个异常本质就是 rpc 调用超时,rocket 的 rpc 请求都是异步的。可能是有人发送了大消息,或者 rocket 发生了波动。1、broker 上不存在该 topic,创建该 topic 即可;注意:测试环境 topic 都是自动创建,偶尔会出现创建异常情况,使用手动创建保证创建成功;当然以上都是建立在你的程序没有问题的基础上!1、首先来到rocketmq目录下,修改conf文件夹下broker.conf 文件当中的配置。2、broker 没有正确链接到name server上; 阅读详情

相关推荐

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 消费者部分小结:源码解读小

roykingw的专栏 743

RocketMQ源码分析

RocketMQ源码分析

lx9876lx的博客 8282

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

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

money9sun的博客 598

客户端时不时报org.apache.rocketmq.remoting.exception.RemotingTimeoutException: wait response on the channel

原因分析: 原因一:打开了VIP通道,发送服务初始化时需要手动设置为false #解决方式 producer.setSendMessageWithVIPChannel(false); 原因二:是在代码debug模式,debug时间过长,导致发送报错 ##解决方式 解决:缩短debug时长,再进行检查 ...

心情舒畅 1万+

Linux虚拟机mysql安装教程(详细步骤)出现了一个错误:依赖检测失败

Linux虚拟机安装mysql的详细步骤(有报错预警哦)

m0_74953387的博客 5259

保姆级教程:用Dify+DeepSeek API打造你的私人股票分析助手(附完整配置流程)

本文提供了一份详细的教程,指导用户如何利用Dify低代码平台和DeepSeek API构建一个私人股票分析助手。内容涵盖从环境准备、Dify部署、DeepSeek模型配置,到设计智能体工作流和编写高效提示词的完整流程,旨在帮助投资者和开发者快速打造专属的AI投资分析工具。

weixin_29079671的博客 640

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

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

java_121388的博客 6127

RK3588平台开发系列讲解(DMA篇)DMA engine使用

Linux 内核的 DMA 引擎提供了一组完整的接口,用于申请和释放 DMA 通道、准备 DMA 描述符、启动和控制 DMA 传输,以及同步和管理缓存。通过这些接口,内核能够高效地处理异步的 DMA 传输任务,减少 CPU 的干预,提高数据传输的效率。

内核笔记 1836

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

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

舒一笑的博客 2万+

.Net如何使用Web API实现数据交互?

数据模型代表了要交互的数据结构。例如,假设我们要创建一个简单的图书管理系统,我们可以定义一个Book类作为数据模型。set;set;set;

Code365 262

C# Winform使用Monaco打造代码编辑器

本文介绍了如何在Winform项目中集成Monaco代码编辑器。通过NuGet安装WebView2控件,创建monaco-editor.html文件加载编辑器,并实现与C#代码的交互。关键步骤包括:初始化WebView2环境、配置Monaco编辑器参数、设置代码变更监听事件以及处理C#与JavaScript之间的通信。注意事项提示了依赖库安装问题的解决方法。该方案实现了功能完整的代码编辑器,支持代码自动保存和实时显示功能。

遇见--专栏 347

04-RocketMQ源码解读

04-RocketMQ源码解读

Joanna_or_zhouzhou的博客 892

FT2004(D2000)开发实战之网口stmmac报错调试(Failed to reset the dma)

网口stmmac报错调试(Failed to reset the dma)

嵌入式Linux 3587

RocketMQ核心源码解读(一)

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

weixin_58611042的博客 1437

Android Telephony主要模块及功能

Telephony的代码主要由五个模块组成 1.Telephony Frameworks 代码区域: frameworks/opt/telephony/ 其中主要的文件在如下目录 /frameworks/opt/telephony/src/java/com/android/internal/telephony/ 其中比较常见的有以下几类文件 1.BaseCommands、RIL构成R

泊客 7727

如何卸载Gazebo与重装

gazebo是一款关于车辆和无人机的仿真软件,本文大致介绍它是何物,以及他的安装和卸载方法,对于ROS开发者,本文有一定参考意义。

gongdiwudu的专栏 1万+

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

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

四: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的博客 912

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

rocketmq源码解读-start

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

u012690015的博客 880

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

全网最细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 源码解读方案(上)赶紧收藏
下一篇: 你在简历里给自己挖的坑,面试官又问到了……
架构文摘JGWZ
博客等级 码龄5年 8808粉丝 345原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值