大家好,我是君哥。今天给大家介绍一下RocketMQ5.0在源码方面的变化。RocketMQ5.0是一个里程碑版本。经过近5年的打磨,代码改动达到60%。首先看一下源码中模块的变化,如下图所示:从图中可以看出,RocketMQ5.0主要新增了4个模块,下面分别介绍这4个模块。1.Bazelbazel是Google开源的构建工具。目前广泛应用于云计算领域开源软件(如Kubernetes)的构建。它具有以下特点:1、支持增量编译,支持缓存,支持分布式扩展;2.bazel可以以依赖图的形式清晰的展示当前的依赖关系,比makefile方便;3、Bazel支持多语言构建。RocketMQ5.0引入了bazel构建。2、RocketMQ4.x时代,如果容器采用Master-Slave架构,一旦Broke节点挂掉,无法自动切换。RocketMQ5.0对这种架构进行了改进,引入了BrokerContainer的概念。一个BrokerContainer中可以部署多个Broker。这些Broker拥有独立的端口,完全独立的功能,可以共享同一个节点的资源。如下图:创造性地,可以将Master和Slave节点交叉部署在一个BrokerContainer中,如下图,两个节点是对等部署的:即使Node1节点挂了,Node2节点中的Broker1可以提供读功能,不会丢失消息,而Broker2可以继续提供读写功能。3.controllerRocketMQ5.0引入了DLedgerController架构,解决了传统DLedger架构的不足。(1)在RocketMQ4.x中,传统DLedger如果采用DLedger架构部署,Broker挂掉后可以自动实现主从切换。但是这就需要用RaftCommitlog来代替RocketMQ自带的Commitlog,因为只有这样Commitlog才有投票的能力。Broker主节点挂掉后,从节点根据DLedger协议进行内部协商,选举出新的主节点,自动完成主备切换。但是这种方式存在几个问题:1.消息日志的副本数必须大??于3,这是Raft协议自动选主的要求,造成资源浪费;2.Raft在选主的过程中必须有过半数的节点。副本越多,时间开销越大,会增加ACK延迟;3、CommitLog主从同步需要用到DLedger库,也就是说CommitLog被当做一个Raft日志来进行复制,所以RocketMQ原生的零拷贝,堆外存的优势就发挥不出来了。(2)DLedgerController通过引入DLedgerController架构,RocketMQ将DLedgermaster选择和切换的能力独立成一个可插拔的组件,使得Master-Slave架构也可以具备Failover能力。DLedgerController可以独立部署,也可以部署在NameServer中,共享NameServer资源。部署在NameServer上:独立部署:4、ProxyRocketMQ5.0实现了计算和存储的分离,更好的拥抱云原生。将计算相关的功能抽象为Proxy、协议适配、权限管理、消息管理等。Broker侧重于存储,其架构如下:这样RocketMQ可以更好的接入云端,更好的进行资源调度。5.小结本文从源码的角度描述了RocketMQ5.0的主要变化。为了更好的拥抱云原生,RocketMQ5.0架构发生了比较大的变化,实现了计算和存储的分离,引入bazel进行构建。在高可用方面,RocketMQ5.0改造了传统的基于DLedger的高可用,引入了BrokerContainer点对点部署方案。希望本文能帮助大家了解新版RocketMQ。
