全网最详细的 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万+

概率论与数理统计基础概念与重要定义汇总

文章目录一、随机事件和概率1:互斥,对立,独立事件的定义和性质。2:概率,条件概率和五大概率公式3:古典型,几何型概率和伯努利试验 一、随机事件和概率 1:互斥,对立,独立事件的定义和性质。 互斥事件\color{red}\textbf{互斥事件}互斥事件 事件A和B的交集为空,A与B就是互斥事件,也叫互不相容事件。也可叙述为:不可能同时发生的事件。如A∩B为不可能事件(A∩B=Φ),那么称事件A与事件B互斥,其含义是:事件A与事件B在任何一次试验中不会同时发生。 则P(A+B)=P(A)+P(B)(这个公

csyifanZhang的博客 1万+

MODBUS通讯不求人:手把手教你用三菱FX2N控制士林变频器

本文详细介绍了如何使用三菱FX2N PLC通过MODBUS协议控制士林变频器,涵盖硬件连接、参数配置、程序设计及通讯优化等关键步骤。特别针对没有内置MODBUS函数块的老款PLC,提供了CRC校验和稳定数据交换的实用解决方案,帮助工程师快速实现工业自动化设备的高效通讯。

v4w5x6的博客 226

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

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

java_121388的博客 6127

手把手教你用ObjectCRX进行Caxa二次开发:从零开始的环境搭建教程

本文是一份面向零基础初学者的Caxa二次开发实战指南,重点讲解如何使用ObjectCRX框架从零开始搭建开发环境。内容涵盖Visual Studio 2015版本锁定、ObjectCRX向导集成、项目创建、典型错误解决,并最终实现一个可在Caxa中运行的HelloWorld程序,帮助开发者快速入门并避开常见陷阱。

w3x4y的博客 514

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

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

舒一笑的博客 2万+

电赛2024年H题智能小车基于MSPM0G3507主控MCU(利用8路灰度加上MPU6050的解决方式)

最后我觉得这个项目最重要的部分还是陀螺仪的精准度,如果一个陀螺仪的精准度高,这个项目就十分简单了,像mpu6050这种陀螺仪精准度就稍微差了一点,他有个最严重的问题就是温漂,偏航角会随着温度变化为变化,这一点在跑发挥项一的时候十分关键的,因为这个只差基督就会导致车子跑偏,导致无法完成 整个项目。如果条件足够的话建议可以换一个好一点的陀螺仪,然后就是灰度如果没有条件同样也可以换成红外。以上就是本次项目的一些小建议。

weixin_60991529的博客 6244

WSL2+Ubuntu20.04纯root环境搭建指南:告别权限烦恼的终极方案

本文提供了一份详细的WSL2+Ubuntu20.04纯root环境搭建指南,旨在为本地开发与学习打造一个免去权限干扰、极致流畅的Linux子系统环境。通过启用WSL2、安装Ubuntu 20.04,并执行核心的root用户设置,开发者可以彻底告别频繁的sudo操作,提升在文件操作、容器调试和系统配置等方面的效率。

time3的博客 475

04-RocketMQ源码解读

04-RocketMQ源码解读

Joanna_or_zhouzhou的博客 893

F280049C Buffered Digital-to-Analog Converter (DAC)

使用DAC模块很简单,只需要配置参考电压,并写入DACVALS寄存器一个数字值即可。参考电压可配置为外部参考VDAC和内部参考电压1.65V和2.5V,并结合增益作为DAC模块最终的参考电压DACREF。举个例子,配置参考电压为内部参考电压1.65V,增益设置为2,则参考电压DACREF=3.3V,若向DACVALS写入数字值2048,则输出的DAC模块的输出带电压DACOUT=DACVALS×DACREF4096=1.65VDACOUT=

xht2403267701的博客 2370

RocketMQ核心源码解读(一)

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

weixin_58611042的博客 1437

华为OD机试 - 整型数组按照个位数排序(Java 双机位C卷 100分)

华为OD机试 双机位C卷题库疯狂收录中,刷题。

学Java,找哪吒 350

YOLOv8-COCO指标转换

本文介绍了将YOLO格式数据集转换为COCO格式并评估模型性能的完整流程。首先需将YOLO格式的标注数据转换为COCO格式,通过修改classes、image_path等参数适配不同数据集。然后使用YOLO模型对验证集进行预测并保存结果为JSON格式。最后通过比较预测结果和转换后的COCO标注文件,使用COCO官方评估指标和TIDE工具进行性能分析,生成包含AP、AR等指标的报告及错误分析图表。整个过程实现了从数据准备到模型评估的完整闭环,为计算机视觉任务提供标准化的性能评估方案。

FJN110的博客 403

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

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

四: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

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

rocketmq源码解读-start

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

u012690015的博客 880

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

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

全网最细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 源码解读方案(上)赶紧收藏
下一篇: 替代Postman ,17.3K star!
架构文摘JGWZ
博客等级 码龄5年 8808粉丝 345原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值