从源码上看,RocketMQ 5.0 跟 RocketMQ 4.x相比增加了哪几个模块

简介: 从源码上看,RocketMQ 5.0 跟 RocketMQ 4.x相比增加了哪几个模块

大家好,我是君哥。

今天来介绍一下 RocketMQ 5.0 源码上的变化。

RocketMQ 5.0 是一个里程碑式的版本,经历了近 5 年的打磨,代码变更达到 60%。

首先看一下源码中模块的变化,如下图:

微信图片_20221213122903.png

从图中可以看到,RocketMQ 5.0 主要增加了 4 个模块儿,下面介绍一下这 4 个模块儿。

1 bazel

bazel 是 Google 开源的构建工具,目前广泛用于云计算领域的开源软件(如 Kubernetes)构建,它有如下特点:1.支持增量式编译、支持缓存、支持分布式扩展;2.bazel 可以清晰地以依赖关系图的方式展现出当前的依赖关系,比 makefile 更加方便;3.bazel支持多语言构建。

RocketMQ 5.0 引入了 bazel 构建。

2 container

在 RocketMQ 4.x 时代,如果采用 Master-Slave 架构,Broke 节点一旦挂了,是不能自动切换的。RocketMQ 5.0 对这个架构进行了改进,引入了 BrokerContainer 的概念,一个 BrokerContainer 中可以部署多个 Broker,这些 Broker 拥有独立的端口,功能完全独立,并且可以共享同一个节点的资源。如下图:

微信图片_20221213122926.png

有创造性的是,在一个 BrokerContainer 中可以交叉部署 Master 和 Slave 节点,如下图两节点对等部署:

微信图片_20221213122947.png

这样做有即使 Node1 节点挂了,Node2 节点中的 Broker1 可以提供读功能,并不会丢消息,而 Broker2 则可以继续提供读写功能。

3 controller

RocketMQ 5.0 引入了 DLedger Controller 架构,解决传统 DLedger 架构的不足。

3.1 传统 DLedger

在 RocketMQ 4.x 中,如果采用 DLedger 架构部署,Broker 挂掉后,是可以自动实现主从切换的。但这样需要用 Raft Commitlog 来取代 RocketMQ 自身的 Commitlog,因为只有这样 Commitlog 才会具有选举的能力。Broker 主节点挂掉后,从节点依照 DLedger 协议进行内部协商,选举出新的主节点,自动完成主备切换。

不过这样存在几个问题:

1.消息日志副本数必须是 3 个以上,这个是 Raft 协议自动选主的要求,造成资源浪费;

2.Raft 选主过程中必须有多数节点同意才能选主成功,副本数越多时间开销会越大,这会加大 ACK 延时;

3.CommitLog 主从同步需要使用 DLedger 库,也就是说 CommitLog 被看作是 Raft log 进行复制,这样 RocketMQ 原生的零拷贝、堆外内存的优势无法使用了。

3.1 DLedgerController

通过引入 DLedger Controller 架构,RocketMQ 将 DLedger 选主切换的能力独立成一个可以拔插的组件,这样 Master-Slave 架构也可以具有 Failover 的能力。

DLedger Controller 可以独立部署,也可以部署在 NameServer 中,共享 NameServer 资源。

部署在 NameServer:

微信图片_20221213123018.png

立部署:

微信图片_20221213123038.png

4 Proxy

RocketMQ 5.0 为了更好地拥抱云原生,实现了计算和存储相分离。把计算相关的功能抽象到了 Proxy,协议适配、权限管理、消息管理等。Broker 则专注于存储,架构如下图:

微信图片_20221213123056.png

这样 RocketMQ 可以更好地上云,更好地进行资源调度。

5 总结

本文从源码角度讲述了 RocketMQ 5.0 主要的变化。

为了更好地拥抱云原生, RocketMQ 5.0 架构上发生了比较大的变化,实现计算存储相分离,并且引入 bazel 进行构建。

在高可用方面,RocketMQ 5.0  对传统的基于 DLedger 的高可用进行了改造,同时引入了 BrokerContainer 对等部署方案。

希望本文对你理解新版本的 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
相关文章
|
1月前
|
消息中间件 存储 监控
深度写作:深入源码理解MQ长轮询优化机制
【11月更文挑战第22天】在分布式系统中,消息队列(Message Queue, MQ)扮演着至关重要的角色。MQ不仅实现了应用间的解耦,还提供了异步消息处理、流量削峰等功能。而在MQ的众多特性中,长轮询(Long Polling)机制因其能有效提升消息处理的实时性和效率,备受关注。
66 12
|
1月前
|
消息中间件 存储 Java
深入源码理解MQ长轮询优化机制
【11月更文挑战第22天】在分布式系统中,消息队列(MQ)作为一种重要的中间件,广泛应用于解耦、异步处理、流量削峰等场景。其中,延时消息和定时消息作为MQ的高级功能,能够进一步满足复杂的业务需求。为了实现这些功能,MQ系统需要进行一系列优化,长轮询机制便是其中的关键一环。本文将深入探讨MQ如何设计延时消息和定时消息的优化机制,特别是长轮询机制的实现原理及其在Java中的模拟实现。
36 2
|
6月前
|
消息中间件 数据可视化 Go
Rabbitmq 搭建使用案例 [附源码]
Rabbitmq 搭建使用案例 [附源码]
51 0
|
2月前
|
传感器 数据可视化 网络协议
DIY可视化整合MQTT生成UniApp源码
DIY可视化整合MQTT生成UniApp源码
49 0
|
7月前
|
消息中间件 小程序 网络性能优化
蓝易云 - 直播小程序源码有用的协议知识:MQTT协
在直播小程序源码中,MQTT协议可以用于实现实时消息推送,如弹幕、聊天消息、礼物信息等。通过使用MQTT协议,可以确保消息的实时性和可靠性,从而提高用户体验。
196 0
|
7月前
|
消息中间件 Java 调度
【深度挖掘RocketMQ底层源码】「底层源码挖掘系列」透彻剖析贯穿RocketMQ的消费者端的运行调度的流程(Pull模式)
【深度挖掘RocketMQ底层源码】「底层源码挖掘系列」透彻剖析贯穿RocketMQ的消费者端的运行调度的流程(Pull模式)
68 1
|
7月前
|
消息中间件 Java RocketMQ
【深度挖掘 RocketMQ底层源码】「底层源码挖掘系列」抽丝剥茧贯穿RocketMQ的消费者端的运行核心的流程(Pull模式-下)
【深度挖掘 RocketMQ底层源码】「底层源码挖掘系列」抽丝剥茧贯穿RocketMQ的消费者端的运行核心的流程(Pull模式-下)
50 1
|
7月前
|
消息中间件 存储 NoSQL
【深度挖掘 RocketMQ底层源码】「底层源码挖掘系列」透彻剖析贯穿RocketMQ的消费者端的运行核心的流程(Pull模式-上)
【深度挖掘 RocketMQ底层源码】「底层源码挖掘系列」透彻剖析贯穿RocketMQ的消费者端的运行核心的流程(Pull模式-上)
62 1
|
7月前
|
消息中间件 存储 Kafka
【深入浅出 RocketMQ原理及实战】「底层源码挖掘系列」透彻剖析贯穿一下RocketMQ和Kafka索引设计原理和方案
【深入浅出 RocketMQ原理及实战】「底层源码挖掘系列」透彻剖析贯穿一下RocketMQ和Kafka索引设计原理和方案
133 1
|
7月前
|
消息中间件 存储 负载均衡
精华推荐 | 【深入浅出 RocketMQ原理及实战】「底层源码挖掘系列」透彻剖析贯穿RocketMQ的消费者端的运行核心的流程(上篇)
精华推荐 | 【深入浅出 RocketMQ原理及实战】「底层源码挖掘系列」透彻剖析贯穿RocketMQ的消费者端的运行核心的流程(上篇)
77 1