源码阅读技巧篇:RocketMQ DLedger 多副本即主从切换专栏回顾

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: RocketMQ DLedger 多副本即主从切换专栏总共包含9篇文章,时间跨度大概为2个月的时间,笔者觉得授人以鱼不如授人以渔,借以这个系列来展示该系列的创作始末,展示笔者阅读源码的技巧。 首先在下决心研读 RocketMQ DLedger 多副本(主从切换)的源码之前,首先还是要通过官方的分享、百度等途径对该功能进行一些基本的了解。

RocketMQ DLedger 多副本即主从切换专栏总共包含9篇文章,时间跨度大概为2个月的时间,笔者觉得授人以鱼不如授人以渔,借以这个系列来展示该系列的创作始末,展示笔者阅读源码的技巧。

首先在下决心研读 RocketMQ DLedger 多副本(主从切换)的源码之前,首先还是要通过官方的分享、百度等途径对该功能进行一些基本的了解。

我们了解到 RocketMQ 在 4.5.0 之前提供了主从同步功能,即当主节点宕机后,消费端可以继续从从节点上消费消息,但无法继续向该复制组发送消息。RocketMQ 4.5.0版本引入了多副本机制,即 DLedger,支持主从切换,即当一个复制组内的主节点宕机后,会在该复制组内触发重新选主,选主完成后即可继续提供消息写功能。同时还了解到 rocketmq 主从切换是基于 raft 协议的。

raft 协议是何许人也,我猜想大部分读者对这个名词并不陌生,但像笔者一样只是听过其大体作用但并未详细学习的应该也不在少数,故我觉得看 RocketMQ DLedger 多副本即主从切换之前应该重点了解 raft 协议。

1、RocketMQ 多副本前置篇:初探raft协议

本文主要根据 raft 官方提供的动画来学习了解 raft 协议,从本文基本得知了 raft 协议主要包含两个重要部分:选主 以及 日志复制。在了解了 raft 协议的选主、日志复制的基本实现后,然后就可以步入到 RocketMQ DLedger 多副本即主从切换的源码研究了,以探究大神是如何实现 raft 协议的。同时在了解到了 raft 协议的选主部分内容后,自己也可以简单的思考,如果自己去实现 raft 协议,应该要实现哪些关键点,当时我的思考如下:
在这里插入图片描述
这样在看源码时更加有针对性,不至于在阅读源码过程中“迷失”。

2、源码分析 RocketMQ DLedger 多副本之 Leader 选主

本文按照上一篇的思路,重点对 DLedgerLeaderElector 的实现进行了详细分析,特别是其内部的状态机流转,最后也给出一张流程图对选主过程进行一个简单的梳理与总结。

温馨提示:如果在阅读源码的过程中一时无法理解,可以允许其提供的单元测试,DEBUG一下,可以起到拨云见雾之效。

3、源码分析 RocketMQ DLedger 多副本存储实现

在学习完 DLedger 选主实现后,接下来将重点突破 raft 协议的另外一个部分:日志复制。因为日志复制将涉及到存储,故在学习日志复制之前,先来看一下 DLedger 与存储相关的设计,例如 DLedger 日志条目的存储协议、日志在服务器的组织等关系,这部分类比 RocketMQ commitlog 等的存储。

4、源码分析 RocketMQ DLedger(多副本) 之日志追加流程

在学习完DLedger 多副本即主从切换 日志存储后,我们将正式进入到日志复制部分,从上图我们可以简单了解,日志复制其实包含两个比较大的阶段,第一阶段是指主节点(Leader)接受客户端请求后,将数据先存储到主服务器中,然后再将数据转发到它的所有从节点。故本篇文章中的关注第一阶段:日志追加。

5、源码分析 RocketMQ DLedger(多副本) 之日志复制(传播)
本文继续关注日志复制的第二个阶段,包含主节点日志转发、从节点接收日志、主节点对日志转发进行仲裁,即需要实现只有超过集群半数节点都存储成功才认为该消息已成功提交,才会对客户端承偌消息发送成功。

6、基于 raft 协议的 RocketMQ DLedger 多副本日志复制设计原理

源码解读 raft 协议的日志复制部分毕竟比较枯燥,故本文梳理了3张流程图,并对日志的实现要点做一个总结,以此来介绍 rocketmq Dledger 多副本即主从切换部分的 raft 协议的解读。

7、RocketMQ 整合 DLedger(多副本)即主从切换实现平滑升级的设计技巧

前面6篇文章都聚焦在 raft 协议的选主与日志复制。从本节开始将介绍 rocketmq 主从切换的实现细节,基于 raft 协议已经可以实现主节点的选主与日志复制,主从切换的另外一个核心就是主从切换后元数据的同步,例如topic、消费组订阅信息、消息消费进度等。另外主从切换是rocketmq 4.5.0 版本才引入的,如果从老版本升级到 4.5.0,直接兼容原先的消息是重中之中,故本文将详细剖析其设计要点。

8、源码分析 RocketMQ DLedger 多副本即主从切换实现原理

从设计上理解了平滑升级的技巧,本篇就从源码角度剖析主从切换的实现要点,即重点关注元数据的同步(特别是消息消费进度的同步)。

9、RocketMQ DLedger 多副本即主从切换实战

经过前面8篇文章的铺垫,我相信大家对 DLedger 的实现原理有了一个全新的认识,本篇作为该系列的收官之作,介绍如何从主从同步集群平滑升级到DLedger,即主从切换版本,并对功能进行验证。

整体总结一下就是首先从整体上认识其核心要点,然后逐步展开,逐步分解形成一篇一篇的文章,在遇到看不懂的时候,可以 debug 官方提供的单元测试用例。

温馨提示:本专栏是《RocketMQ技术内幕》作者倾力打造的又一个精彩系列,也是《RocketMQ技术内幕》第二版的原始素材。


原文发布时间为:2019-10-20
本文作者:丁威,《RocketMQ技术内幕》作者。
本文来自中间件兴趣圈,了解相关信息可以关注中间件兴趣圈

相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
7月前
|
Java API 网络架构
关于 Spring Integration 你知道多少,包含集成MQTT案例讲述及源码3
关于 Spring Integration 你知道多少,包含集成MQTT案例讲述及源码
1128 0
关于 Spring Integration 你知道多少,包含集成MQTT案例讲述及源码3
|
7月前
|
消息中间件 Java API
RocketMQ事务消息, 图文、源码学习探究~
介绍 RocketMQ是阿里巴巴开源的分布式消息中间件,它是一个高性能、低延迟、可靠的消息队列系统,用于在分布式系统中进行异步通信。 从4.3.0版本开始正式支持分布式事务消息~ RocketMq事务消息支持最终一致性:在普通消息基础上,支持二阶段的提交能力。将二阶段提交和本地事务绑定,实现全局提交结果的一致性。 原理、流程 本质上RocketMq的事务能力是基于二阶段提交来实现的 在消息发送上,将二阶段提交与本地事务绑定 本地事务执行成功,则事务消息成功,可以交由Consumer消费 本地事务执行失败,则事务消息失败,Consumer无法消费 但是,RocketMq只能保证本地事务
|
7月前
|
消息中间件 Apache 开发工具
RocketMQ-初体验RocketMQ(08)-IDEA拉取调测RocketMQ源码
RocketMQ-初体验RocketMQ(08)-IDEA拉取调测RocketMQ源码
66 0
|
20天前
|
消息中间件 存储 监控
深度写作:深入源码理解MQ长轮询优化机制
【11月更文挑战第22天】在分布式系统中,消息队列(Message Queue, MQ)扮演着至关重要的角色。MQ不仅实现了应用间的解耦,还提供了异步消息处理、流量削峰等功能。而在MQ的众多特性中,长轮询(Long Polling)机制因其能有效提升消息处理的实时性和效率,备受关注。
55 12
|
20天前
|
消息中间件 存储 Java
深入源码理解MQ长轮询优化机制
【11月更文挑战第22天】在分布式系统中,消息队列(MQ)作为一种重要的中间件,广泛应用于解耦、异步处理、流量削峰等场景。其中,延时消息和定时消息作为MQ的高级功能,能够进一步满足复杂的业务需求。为了实现这些功能,MQ系统需要进行一系列优化,长轮询机制便是其中的关键一环。本文将深入探讨MQ如何设计延时消息和定时消息的优化机制,特别是长轮询机制的实现原理及其在Java中的模拟实现。
32 2
|
6月前
|
消息中间件 数据可视化 Go
Rabbitmq 搭建使用案例 [附源码]
Rabbitmq 搭建使用案例 [附源码]
49 0
|
2月前
|
传感器 数据可视化 网络协议
DIY可视化整合MQTT生成UniApp源码
DIY可视化整合MQTT生成UniApp源码
47 0
|
5月前
|
消息中间件 存储 负载均衡
MetaQ/RocketMQ 原理问题之避免重复消费问题如何解决
MetaQ/RocketMQ 原理问题之避免重复消费问题如何解决
132 1
|
消息中间件 中间件 Kafka
RocketMQ源码(二)消息消费的模式到底是Push还是Pull?
RocketMQ源码(二)消息消费的模式到底是Push还是Pull?
128 1
|
7月前
|
消息中间件 小程序 网络性能优化
蓝易云 - 直播小程序源码有用的协议知识:MQTT协
在直播小程序源码中,MQTT协议可以用于实现实时消息推送,如弹幕、聊天消息、礼物信息等。通过使用MQTT协议,可以确保消息的实时性和可靠性,从而提高用户体验。
195 0