源码研究RocketMQ
文章平均质量分 93
分析了NameServer实现原理、消息发送与高可用设计、消息存储、消息消费、消息拉取、消息队列负载、消息重试机制、定时消息、消息消费进度管理、消息文件、消息消费队列文件、消息Hash索引机制、消息过滤机制、过期文件删除、顺序消息实现原理、消息主从同步实现原理等。
中间件兴趣圈
《RocketMQ技术内幕》一书作者、RocketMQ开源社区优秀布道师、CSDN2020博客之星TOP2,主打成体系剖析java中间件,已发布RocketMQ、Kafka、Dubbo、Sentinel、Canal、ElasticJob、ElasticSearch等15个专栏。
展开
-
事务消息应用场景、实现原理与项目实战(附全部源码)
本文目录1、活动中心场景介绍2、事务消息实现原理3、事务消息实战3.1 UserServiceImpl 核心实现3.2 UserRegTransactionListener 核心实现3.2.1 实现 executeLocalTransaction3.2.2 实现 checkLocalTransaction3.3 代码获取1、活动中心场景介绍在电商系统上线初期,往往会进行一些“拉新”活动,例如活动部门提出新用户注册送积分、送优惠券活动。基于分布式、微服务的设计理念,通常的架构设计(子系统交互)如下图所示原创 2021-03-08 23:32:44 · 2777 阅读 · 14 评论 -
RocketMQ避坑指南:你部署的RocketMQ集群真的是高可用?
笔者比较“悲催”,临近年末由笔者维护的生产MQ集群中的一台物理机内存故障导致操作系统异常重启,持续10分钟中出现众多的应用发送客户端出现发送消息络超时,导致事故并定性为S1,笔者的“年终奖”。。。1、故障描述RocketMQ 集群采取的部署架构为2主2从,其部署架构如下图所示:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传其部署架构中一个非常明显的特点是一台物理机上分别部署了 nameserver,broker 两个进程。其中一台机器(192.168.3.100)的内存出现原创 2020-12-31 12:24:56 · 5748 阅读 · 7 评论 -
RocketMQ核心概念扫盲篇
在正式进入RocketMQ的学习之前,我觉得有必要梳理一下RocketMQ核心概念,为大家学习RocketMQ打下牢固的基础。1、RocketMQ部署架构在RocketMQ主要的组件如下:NameserverNameserver集群,topic的路由注册中心,为客户端根据Topic提供路由服务,从而引导客户端向Broker发送消息。Nameserver之间的节点不通信。路由信息在Nameserver集群中数据一致性采取的最终一致性。Broker消息存储服务器,分为两种角色:Master原创 2020-10-19 22:10:10 · 3734 阅读 · 1 评论 -
RocketMQ学习环境搭建(RocketMQ安装与IDEA Debug环境搭建)
本文主要分如下几个部分展开:Linux服务器安装RocketMQ、RocketMQ-ConsoleIDEA中搭建可调试环境1、Linux安装RocketMQ、RocketMQ-Console1.1安装RocketMQStep1:从如下地址下载RocketMQ安装包cd /opt/applicationwget https://mirrors.tuna.tsinghua.edu.cn/apache/rocketmq/4.7.1/rocketmq-all-4.7.1-bin-release.z原创 2020-10-13 21:25:56 · 2494 阅读 · 4 评论 -
RocketMQ消息发送常见错误与解决方案
本文将结合自己使用RocketMQ的经验,对消息发送常见的问题进行分享,基本会遵循出现问题,分析问题、解决问题。1、No route info of this topic无法找到路由信息,其完整的错误堆栈信息如下:而且很多读者朋友会说Broker端开启了自动创建主题也会出现上述问题。RocketMQ的路由寻找流程如下图所示:上面的核心关键点如下:如果Broker开启了自动创建Topic,在启动的时候会默认创建主题:TBW102,并会随着Broker发送到Nameserver的心跳包汇报给Nam原创 2020-09-30 20:42:07 · 18743 阅读 · 1 评论 -
我的另一种参与 RocketMQ 开源社区的方式
一个草根程序员参与开源项目的另外一种方式。原创 2020-06-08 19:10:34 · 1698 阅读 · 1 评论 -
RocketMQ一行代码造成大量消息发送失败
1、问题现象首先接到项目反馈使用 RocketMQ 会出现如下错误:错误信息关键点:MQBrokerException:CODE:2 DESC:[TIMEOUT_CLEAN_QUEUE]broker busy,start flow control for a while,period in queue:205ms,size of queue:880。由于项目组并没有对消息发送失败做任何补偿,导致丢失消息丢失,故需要对这个问题进行深层次的探讨,并加以解决。2、问题分析首先我们根据关键字:TIMEO原创 2020-05-18 21:01:58 · 21428 阅读 · 21 评论 -
RocketMQ msgId与offsetMsgId释疑(实战篇)
消息发送、消息消费、RocketMQ queryMsgById命令以及rocketmq-console等使用场景中究竟是用的msgId还是offsetMsgId。原创 2020-03-08 20:43:03 · 7460 阅读 · 6 评论 -
踩坑记:rocketmq-console 消费TPS为0,但消息积压数却在降低是个什么“鬼”
本节目录1、背景2、问题分析2.1 rocketmq-console 数据获获取逻辑探讨2.2 rocketmq 消费TPS统计实现原理2.2.1 消费TPS计算逻辑2.2.2 如何采集消费TPS原始数据3、问题解答1、背景上周六的19:00,接到项目反馈,他们的项目从昨天的23:00就停止消费了,而整个集群没有出现异常,故此种情况更多的是因为项目组的原因,由于业务已积压将近一天,并且项目在昨...原创 2019-12-02 21:31:26 · 8488 阅读 · 5 评论 -
一次 RocketMQ 进程自动退出排查经验分享(实战篇)
1、背景公司一个 RocketMQ 集群由4主4从组成,突然其中3台服务器“竟然”在同一时间下线,其监控显示如下:依次查看三台机器的监控图形,时间戳几乎完美“吻合”,不可思议吧。2、故障分析出现问题,先二话不说,马上重启各服务器,尽快恢复集群,降低对业务的影响,接下来开始对日志进行分析。Java 进程自动退出(rocketmq 本身就是一个java进程),一种最常见的问题是由于内存溢出...原创 2019-10-27 09:58:04 · 4671 阅读 · 8 评论 -
再谈 RocketMQ broker busy(实战篇)
本文将在 RocketMQ 消息发送system busy、broker busy原因分析与解决方案 的基础上,结合生产上的日志尝试再次理解 broker busy 以及探讨解决方案。首先,broker busy 相关的日志关键字如下:[REJECTREQUEST]system busytoo many requests and system thread pool busy[PC_SY...原创 2019-10-24 09:04:28 · 3630 阅读 · 0 评论 -
源码阅读技巧篇:RocketMQ DLedger 多副本即主从切换专栏回顾
源码阅读技巧篇,以笔者从零开始学习 rocketmq dledger 多副本即主从切换为例,展示笔者的阅读源码的方法。原创 2019-10-20 22:04:02 · 1226 阅读 · 1 评论 -
RocketMQ 升级到主从切换(DLedger、多副本)实战
本文主要介绍如何将 RocketMQ 集群从原先的主从同步升级到主从切换。本文首先先介绍与 DLedger 多副本即 RocketMQ 主从切换相关的核心配置属性,然后尝试搭建一个DLedger 集群,从原先的 RocketMQ 集群平滑升级到 DLedger 集群的示例,并简单测试一下主从切换功能。本节目录1、RocketMQ DLedger 多副本即主从切换核心配置参数详解2、搭建主从同步...原创 2019-10-13 16:12:04 · 5315 阅读 · 8 评论 -
源码分析RocketMQ系列索引
1、RocketMQ源码分析之NameServer2、RocketMQ源码分析之Broker概述与同步消息发送原理与高可用设计及思考3、源码分析RocketMQ之CommitLog消息存储机制4、源码分析RocketMQ之消息消费5、源码分析RocketMQ消息消费机制----消费者拉取消息机制6、 源码分析RocketMQ消息消费机制----消费端消息负载均衡机制与重新分布...原创 2017-12-24 23:01:08 · 32910 阅读 · 11 评论 -
RocketMQ源码分析之NameServer
1、RocketMQ组件概述NameServer NameServer相当于配置中心,维护Broker集群、Broker信息、Broker存活信息、主题与队列信息等。NameServer彼此之间不通信,每个Broker与集群内所有的Nameserver保持长连接。2、源码分析NameServer本文不对 NameServer 与 Broker、Producer 集群、Cons...原创 2017-07-17 23:06:40 · 13581 阅读 · 8 评论 -
RocketMQ源码分析之Broker概述与同步消息发送原理与高可用设计及思考
1、Broker概述Broker 在 RocketMQ 架构中的角色,就是存储消息,核心任务就是持久化消息,生产者发送消息给 Broker,消费者从 Broker 消费消息,其物理部署架构图如下:备注:以上摘录自官方 RocketMQ 设计文档。上述基本描述了消息中间件的架构设计,不仅限于 RocketMQ,不同消息中间件的最大区别之一在消息的存储上。2、B...原创 2017-07-22 18:58:17 · 11216 阅读 · 13 评论 -
源码分析RocketMQ之CommitLog消息存储机制
本文重点分析 Broker 接收到生产者发送消息请求后如何存储在 Broker 上,本文暂不关注事务消息机制。本文前置篇:RocketMQ源码分析之Broker概述与同步消息发送原理与高可用设计及思考。RocketMQ 的存储核心类为 DefaultMessageStore,存储消息的入口方法为:putMessage。在深入学习消息存储之前,我们先大概了解一下DefaultMessa...原创 2017-08-03 22:59:58 · 14567 阅读 · 8 评论 -
源码分析RocketMQ之消息消费概述
1、消息消费概述消息消费方式 拉取、推送。 消费者组与消费模式 多个消费者组成一个消费组,两种模式:集群(消息被其中任何一个消息者消费)、广播模式(全部消费者消费)。 ConsumeFromWhereconsumeFromWhere 从何处开始消费,可选值: 1)CONSUME_FROM_LAST_OFFSET:上一次消费偏移量 2)CONSUME_FROM_FIRST_OFF...原创 2017-09-25 21:53:13 · 7746 阅读 · 1 评论 -
源码分析RocketMQ消息消费机制----消费者拉取消息机制
本文首先主要阐明RocketMQ作为消息中间件,需要解决消息消费中的哪些常用问题,然后带着这些疑问,重点剖析了RocketMQ消息拉取机制。原创 2017-12-24 15:52:22 · 27850 阅读 · 17 评论 -
源码分析RocketMQ消息消费机制----消费端消息负载均衡机制与重新分布
1、消息消费需要解决的问题首先再次重复啰嗦一下 RocketMQ 消息消费的一些基本元素的关系主题 ---》 消息队列(MessageQueue) 1 对多。主题 ---》 消息生产者,一般主题会由多个生产者组成,生产者组。主题 ---》 消息消费者,一般一个主题也会被多个消费者消费。那消息消费至少需要解决如下问题:1、一个消费组中多个消费者是如何对消息队列(1个主题...原创 2017-12-28 23:20:45 · 5548 阅读 · 2 评论 -
源码分析RocketMQ之消息消费重试机制
本文主要关注业务方在消息消费失败后,返回ConsumeConcurrentlyStatus.RECONSUME_LATER,专业术语:业务方每条消息消费后要告诉MQ消费者一个结果(ack,message back),触发MQ消息消费重试机制,然后MQ消费者需要反馈给MQ(Broker)本文主要针对的还是非顺序消息机制,顺序消息在后续专题详细分析。代码入口:ConsumeMessageCon原创 2018-01-07 23:19:14 · 11700 阅读 · 5 评论 -
源码分析RocketMQ之消息ACK机制(消费进度)
1、消息消费进度概述首先简要阐述一下消息消费进度:消费者订阅消息消费队列(MessageQueue), 当生产者将消息负载发送到 MessageQueue 中时,消费订阅者开始消费消息,消息消费过程中,为了避免重复消费,需要一个地方存储消费进度(消费偏移量)。消息模式主要分为集群模式、广播模式:集群模式:一条消息被集群中任何一个消费者消费。 广播模式:每条消息都被每一个消费者消费...原创 2018-01-17 22:56:34 · 9396 阅读 · 11 评论 -
源码分析RocketMQ之消费队列、Index索引文件存储结构与存储机制-上篇
RocketMQ 存储基础回顾: 源码分析RocketMQ之CommitLog消息存储机制本文主要从源码的角度分析 Rocketmq 消费队列 ConsumeQueue 物理文件的构建与存储结构,同时分析 RocketMQ 索引文件IndexFile 文件的存储原理、存储格式以及检索方式。RocketMQ 的存储机制是所有的主题消息都存储在 CommitLog 文件中,也就是消息发送是完全的顺...原创 2018-01-24 22:32:28 · 6482 阅读 · 1 评论 -
源码分析RocketMQ之消费队列、Index索引文件存储结构与存储机制-下篇
上篇主要是讲解 RocketMQ 运行过程中消息发送者发送一条消息,进入到 commitlog 文件,然后是如何被转发到consumequeue、index索引文件中的,本节主要剖析一下,在 RocketMQ 启动过程中,是如何根据 commitlog 重构consumeque,index的,因为毕竟 commitlog 文件中的消息与 consumequeue 中的文件内容并不能确保是一致的。...原创 2018-01-27 12:48:30 · 2723 阅读 · 0 评论 -
源码分析RocketMQ刷盘机制
RocketMQ 刷盘支持同步刷盘和异步刷盘。为了了解其具体实现,我们以 Commitlog 的存储为例来说明 RocketMQ 是如何进行磁盘读写。Comitlog#putMessage 首先将消息写入到 MappedFile,内存映射文件。然后根据刷盘策略刷写到磁盘,入口如下:CommitLog#handleDiskFlushpublic void handleDiskFlush...原创 2018-01-28 18:42:33 · 7084 阅读 · 11 评论 -
源码分析RocketMQ消息过滤机制上篇-----消息消费服务端过滤与TAG模式过滤实现
1、消息消费过滤机制1.1 根据 tagcode 过滤1.2 高级过滤上述资源来源于 RocketMQ 官方文档。通过官方文档,我们基本可以知道,消息的过滤机制与服务端息息相关,更细一点的讲,与拉取消息实现过程脱离不了关系,事实上也的确如此,MessageFilter 的使用者也就是 DefaultMessageStore#getMessage 方法,为了弄清楚消息过滤...原创 2018-02-04 22:13:18 · 9913 阅读 · 3 评论 -
源码分析RocketMQ消息过滤机制下篇-FilterServer、ClassFilter模式详解
继上篇源码分析了 Tag 过滤机制实现原理,本文主要阐述 RocketMQ SQL92 表达式与 ClassFilte r过滤机制实现。1、RocketMQ SQL92实现原理分析入口:PullMessageProcessor#processRequestif (!ExpressionType.isTagType(subscriptionData.getExpressionType(...原创 2018-02-08 11:29:37 · 3169 阅读 · 0 评论 -
源码分析RocketMQ消息拉取拉模式PULL
消费者 与 消息存储方Broker一般有两种通信机制:推(PUSH)、拉(PULL) 推模式:消息发送者将消息发送到Broker,然后Broker主动推送给订阅了该消息的消费者。 拉模式:消息发送者将消息发送到Broker上,然后由消息消费者自发的向Broker拉取消息。 RocketMQ推拉机制实现: 严格意义上来讲,RocketMQ并没有实现PUSH模式,而是对拉模式进行一层包装,在消...原创 2018-02-22 22:41:56 · 15257 阅读 · 8 评论 -
源码分析RocketMQ消息PULL-长轮询模式
消息拉取为了提高网络性能,在消息服务端根据拉取偏移量去物理文件查找消息时没有找到,并不立即返回消息未找到,而是会将该线程挂起一段时间,然后再次重试,直到重试。挂起分为长轮询或短轮询,在broker端可以通过longPollingEnable=true来开启长轮询。 短轮询:longPollingEnable=false,第一次未拉取到消息后等待shortPollingTimeMills时间后再试...原创 2018-02-23 23:43:05 · 7198 阅读 · 2 评论 -
源码分析RocketMQ顺序消息消费实现原理
所谓顺序消费,rocketmq支持同一消费队列上的消息顺序消费。 消息消费涉及3个点: 1、消息队列重新负载 2、消息拉取 3、消息消费 按照消息消费步骤来揭开RocketMQ顺序消息消费实现原理。 1、消息队列负载 RocketMQ在同一个JVM进程拥有一个clientConfigId(客户端ID),该JVM进程中不同的消息消费组的消息客户端ID相同,因为在JVM进程中对于每一个C...原创 2018-03-02 13:58:30 · 13201 阅读 · 3 评论 -
源码分析RocketMQ文件清除机制
1、由于RocketMQ操作CommitLog、ConsumeQueue文件,都是基于内存映射方法并在启动的时候,会加载commitlog、ConsumeQueue目录下的所有文件,为了避免内存与磁盘的浪费,不可能将消息永久存储在消息服务器上,所以需要一种机制来删除已过期的文件。RocketMQ顺序写Commitlog、ConsumeQueue文件,所有写操作全部落在最后一个CommitLog或C...原创 2018-03-08 11:47:36 · 10086 阅读 · 4 评论 -
源码研究RocketMQ主从同步机制(HA)
HA主从同步的核心类图如图所示: 1、初始RocketMQ HA HAService:主从同步核心实现类。 1)AtomicInteger connectionCount:Master维护的连接数。(Slave的个数)。 2)List connectionList:具体连接信息。 3)AcceptSocketService acceptSocketService:服务端接收连接线程实...原创 2018-03-18 15:06:46 · 8474 阅读 · 16 评论 -
RocketMQ 主从同步读写分离机制
RocketMQ在消息拉取时是如何根据消息消费队列MessageQueue来选择Broker的呢?消息消费队列如图所示: RocketMQ根据MessageQueue查找Broker地址的唯一依据便是brokerName,从RocketMQ的Broker组织实现来看,同一组Broker(M-S)服务器,其brokerName相同,主服务器的brokerId为0,从服务器的brokerId大于...原创 2018-03-18 19:38:46 · 5276 阅读 · 2 评论 -
RocketMQ 整合 DLedger(多副本)即主从切换实现平滑升级的设计技巧
源码分析 RocketMQ DLedger 多副本系列已经进行到第 8 篇了,前面的章节主要是介绍了基于 raft 协议的选主与日志复制,从本篇开始将开始关注如何将 DLedger 应用到 RocketMQ中。摘要:详细分析了RocketMQ DLedger 多副本(主从切换) 是如何整合到 RocketMQ中,本文的行文思路首先结合已掌握的DLedger 多副本相关的知识初步思考其实现思路,...原创 2019-10-03 15:26:15 · 7231 阅读 · 2 评论 -
基于 raft 协议的 RocketMQ DLedger 多副本日志复制设计原理
试图用3张流程图再次揭示 RocketMQ DLedger 多副本即主从切换关于日志复制的实现原理,并思考实现日志复制需要解决的问题。原创 2019-09-28 19:28:52 · 2856 阅读 · 1 评论 -
源码分析 RocketMQ DLedger(多副本) 之日志复制(传播)
详细介绍了rocketmq dledger 多副本之日志转发、日志复制机制,从DLedgerEntryPusher、EntryHandler、QuorumAckChecker、EntryDispatcher的实现细节,并重点阐述了EntryHandler、QuorumAckChecker、EntryDispatcher 这三个线程如何协作完成日志的复制与数据一致性如何得到保证。原创 2019-09-22 17:03:12 · 2636 阅读 · 4 评论 -
源码分析 RocketMQ DLedger(多副本) 之日志追加流程
详细剖析了客户端向 Leader 节点追加消息流程,重点讲述了判断 push 队列是否已满、leader 节点是如何存储日志的,关于日志的复制转发以及仲裁将在下一篇中重点介绍。原创 2019-09-15 19:11:39 · 2824 阅读 · 2 评论 -
RocketMQ 主题扩分片后遇到的坑
消息组接到某项目组反馈,topic 在扩容后出现部分队列无法被消费者,导致消息积压,影响线上业务?考虑到该问题是发送在真实的线上环境,为了避免泄密,本文先在笔者的虚拟机中来重现问题。1、案情回顾1.1 集群现状集群信息如下:例如业务主体名 topic_dw_test_by_order_01 的路由信息如图所示:当前的消费者信息:broker 的配置信息如下:brokerClu...原创 2019-09-08 16:49:08 · 4830 阅读 · 4 评论 -
源码分析 RocketMQ DLedger 多副本存储实现
详细介绍了RocketMQ DLedger 多副本存储实现部分,主要参考RocketMQ 存储部分的设计理念,并重点阐述 DLedger 消除存储格式、索引文件存储格式,诸如内存映射、刷盘、过期文件删除、文件加载与恢复由于在《RocketMQ技术内幕》中详细介绍,故本文并未重复介绍。原创 2019-09-01 17:48:56 · 4274 阅读 · 2 评论 -
RocketMQ源码分析之从官方示例窥探RocketMQ事务消息实现基本思想
RocketMQ4.3.0版本开始支持事务消息,本节开始将剖析事务消息的实现原理,首先将从官方给出的Demo实例入手,以此通往RocketMQ事务消息的世界中。 官方版本未发布之前,从apache rocketmq第一个版本上线后,代码中存在者与事务消息相关的代码,例如COMMIT、ROLLBACK、PREPARED, 网上对于事务消息的“声音”基本上是使用类似二阶段提交,消息系统标...原创 2018-07-28 12:37:42 · 7656 阅读 · 7 评论