從源碼上看,RocketMQ 5.0 跟 RocketMQ 4.x相比增加了哪幾個(gè)模塊
大家好,我是君哥。
今天來介紹一下 RocketMQ 5.0 源碼上的變化。
RocketMQ 5.0 是一個(gè)里程碑式的版本,經(jīng)歷了近 5 年的打磨,代碼變更達(dá)到 60%。
首先看一下源碼中模塊的變化,如下圖:
從圖中可以看到,RocketMQ 5.0 主要增加了 4 個(gè)模塊兒,下面介紹一下這 4 個(gè)模塊兒。
1、bazel
bazel 是 Google 開源的構(gòu)建工具,目前廣泛用于云計(jì)算領(lǐng)域的開源軟件(如 Kubernetes)構(gòu)建,它有如下特點(diǎn):1.支持增量式編譯、支持緩存、支持分布式擴(kuò)展;2.bazel 可以清晰地以依賴關(guān)系圖的方式展現(xiàn)出當(dāng)前的依賴關(guān)系,比 makefile 更加方便;3.bazel支持多語(yǔ)言構(gòu)建。
RocketMQ 5.0 引入了 bazel 構(gòu)建。
2、container
在 RocketMQ 4.x 時(shí)代,如果采用 Master-Slave 架構(gòu),Broke 節(jié)點(diǎn)一旦掛了,是不能自動(dòng)切換的。RocketMQ 5.0 對(duì)這個(gè)架構(gòu)進(jìn)行了改進(jìn),引入了 BrokerContainer 的概念,一個(gè) BrokerContainer 中可以部署多個(gè) Broker,這些 Broker 擁有獨(dú)立的端口,功能完全獨(dú)立,并且可以共享同一個(gè)節(jié)點(diǎn)的資源。如下圖:
有創(chuàng)造性的是,在一個(gè) BrokerContainer 中可以交叉部署 Master 和 Slave 節(jié)點(diǎn),如下圖兩節(jié)點(diǎn)對(duì)等部署:
這樣做有即使 Node1 節(jié)點(diǎn)掛了,Node2 節(jié)點(diǎn)中的 Broker1 可以提供讀功能,并不會(huì)丟消息,而 Broker2 則可以繼續(xù)提供讀寫功能。
3、controller
RocketMQ 5.0 引入了 DLedger Controller 架構(gòu),解決傳統(tǒng) DLedger 架構(gòu)的不足。
(1)傳統(tǒng) DLedger
在 RocketMQ 4.x 中,如果采用 DLedger 架構(gòu)部署,Broker 掛掉后,是可以自動(dòng)實(shí)現(xiàn)主從切換的。但這樣需要用 Raft Commitlog 來取代 RocketMQ 自身的 Commitlog,因?yàn)橹挥羞@樣 Commitlog 才會(huì)具有選舉的能力。Broker 主節(jié)點(diǎn)掛掉后,從節(jié)點(diǎn)依照 DLedger 協(xié)議進(jìn)行內(nèi)部協(xié)商,選舉出新的主節(jié)點(diǎn),自動(dòng)完成主備切換。
不過這樣存在幾個(gè)問題:
1.消息日志副本數(shù)必須是 3 個(gè)以上,這個(gè)是 Raft 協(xié)議自動(dòng)選主的要求,造成資源浪費(fèi);
2.Raft 選主過程中必須有多數(shù)節(jié)點(diǎn)同意才能選主成功,副本數(shù)越多時(shí)間開銷會(huì)越大,這會(huì)加大 ACK 延時(shí);
3.CommitLog 主從同步需要使用 DLedger 庫(kù),也就是說 CommitLog 被看作是 Raft log 進(jìn)行復(fù)制,這樣 RocketMQ 原生的零拷貝、堆外內(nèi)存的優(yōu)勢(shì)無法使用了。
(2)DLedgerController
通過引入 DLedger Controller 架構(gòu),RocketMQ 將 DLedger 選主切換的能力獨(dú)立成一個(gè)可以拔插的組件,這樣 Master-Slave 架構(gòu)也可以具有 Failover 的能力。
DLedger Controller 可以獨(dú)立部署,也可以部署在 NameServer 中,共享 NameServer 資源。
部署在 NameServer:
獨(dú)立部署:
4、Proxy
RocketMQ 5.0 為了更好地?fù)肀г圃瑢?shí)現(xiàn)了計(jì)算和存儲(chǔ)相分離。把計(jì)算相關(guān)的功能抽象到了 Proxy,協(xié)議適配、權(quán)限管理、消息管理等。Broker 則專注于存儲(chǔ),架構(gòu)如下圖:?
這樣 RocketMQ 可以更好地上云,更好地進(jìn)行資源調(diào)度。?
5、總結(jié)
本文從源碼角度講述了 RocketMQ 5.0 主要的變化。
為了更好地?fù)肀г圃?RocketMQ 5.0 架構(gòu)上發(fā)生了比較大的變化,實(shí)現(xiàn)計(jì)算存儲(chǔ)相分離,并且引入 bazel 進(jìn)行構(gòu)建。
在高可用方面,RocketMQ 5.0 對(duì)傳統(tǒng)的基于 DLedger 的高可用進(jìn)行了改造,同時(shí)引入了 BrokerContainer 對(duì)等部署方案。
希望本文對(duì)你理解新版本的 RocketMQ 有所幫助。