|
更多干貨內(nèi)容請(qǐng)關(guān)注微信公眾號(hào)“AI 前線”(ID:ai-front) DDMQ 具有如下的優(yōu)秀特性:
消息隊(duì)列作為構(gòu)建現(xiàn)代分布式應(yīng)用所必備的基礎(chǔ)設(shè)施,有著廣泛的應(yīng)用場(chǎng)景。
下面這張圖描述了 DDMQ 的總體架構(gòu)。主要包括 Broker Cluster、Producer Proxy Cluster(以下簡(jiǎn)稱 PProxy),Consumer Proxy Cluster(以下簡(jiǎn)稱 CProxy),SDK,Console 等模塊。 Broker Cluster 是 DDMQ 的消息存儲(chǔ)層。使用 RocketMQ 作為實(shí)時(shí)消息的存儲(chǔ)引擎(同時(shí)也支持使用 Kafka),Chronos 則是我們基于 RocksDB 自研的延時(shí)消息存儲(chǔ)引擎。 PProxy 是 DDMQ 的生產(chǎn)代理服務(wù), 內(nèi)置 Thrift RPC Server,生產(chǎn) SDK 通過(guò) RPC 調(diào)用將消息發(fā)送給 PProxy,然后再由 PProxy 負(fù)責(zé)將消息生產(chǎn)到具體的 Broker 中去,在 PProxy 中我們實(shí)現(xiàn)了生產(chǎn)限流、重試和消息批量生產(chǎn)等功能。 CProxy 是 DDMQ 的消費(fèi)代理服務(wù),也內(nèi)置了 Thrift RPC Server,當(dāng)選擇 SDK 消費(fèi)時(shí),消費(fèi)方以 pull 的方式從 CProxy 中拉取消息,由于 CProxy 中的 PullBuffer 提前緩存了一定數(shù)量的待消費(fèi)消息,因此消費(fèi)的延遲很低。如果選擇 HTTP 方式消費(fèi),則直接由 CProxy 將消息推送到業(yè)務(wù)指定的回調(diào) URL 地址。在 CProxy 中,我們實(shí)現(xiàn)了消息過(guò)濾(通過(guò)編寫(xiě) Groovy 腳本)、消息體轉(zhuǎn)換(Transit)、重試、消費(fèi)限流、順序消費(fèi)內(nèi)部排序等功能。 Console 是 DDMQ 的控制臺(tái),用戶通過(guò)控制臺(tái)申請(qǐng) Topic、Group 等資源。Topic 等數(shù)據(jù)會(huì)持久化到 MySQL 并推送到 Zookeeper;PProxy 和 CProxy 通過(guò)讀取、監(jiān)聽(tīng) Zookeeper 上的 Topic 和 Group 數(shù)據(jù)來(lái)實(shí)時(shí)控制消息的生產(chǎn)和消費(fèi)邏輯。 DDMQ 選擇 Proxy+SDK 的架構(gòu),主要有這幾個(gè)好處:
在開(kāi)源版本的 RocketMQ 里提供了多種固定延遲 level 的延時(shí)消息支持,可以發(fā)送幾個(gè)固定的延時(shí)時(shí)間的延時(shí)消息,比如延時(shí) 10s, 30s…,但是這種不同延時(shí) level 的延時(shí)消息并不能滿足滴滴內(nèi)部眾多業(yè)務(wù)方的需求,我們需要的是任意時(shí)間精度的延時(shí)。因次我們基于 RocksDB 自研了延時(shí)消息隊(duì)列 Chronos,以 DDMQ 子模塊的形式對(duì)外提供服務(wù)。 上面這張圖描述了 Chronos 的總體結(jié)構(gòu);簡(jiǎn)單來(lái)說(shuō),生產(chǎn) SDK 通過(guò) PProxy 提供的 sendDelay RPC 將延時(shí)消息發(fā)送到 PProxy, 然后由 PProxy 將消息生產(chǎn)到 Chronos 固定的內(nèi)部 topic 上(chronos_inner_xxx)。Chronos 模塊再去消費(fèi) inner topic 的消息并將消息存儲(chǔ)到本地的 RocksDB 里去。基于本地內(nèi)置的 RocksDB 存儲(chǔ)引擎構(gòu)造一個(gè)時(shí)間輪服務(wù),會(huì)將到期的消息再發(fā)送給 PProxy,以供業(yè)務(wù)方消費(fèi)或 HTTP 推送給業(yè)務(wù)方。 熟悉 RocketMQ 的同學(xué)應(yīng)該知道,目前開(kāi)源版本的 RocketMQ broker 是沒(méi)有主從自動(dòng)切換的。如果 Master 掛了,那就寫(xiě)不進(jìn)去了。然后 Slave 只能提供只讀的功能。當(dāng)然如果你的 topic 在多個(gè)主節(jié)點(diǎn)上都創(chuàng)建了,雖然不會(huì)完全寫(xiě)不進(jìn)去,但是對(duì)單分片順序消費(fèi)的場(chǎng)景,還是會(huì)產(chǎn)生影響。所以我們就自己加了一套主從自動(dòng)切換的功能。 結(jié)合 RocketMQ 現(xiàn)有的結(jié)構(gòu),可以采用如上結(jié)構(gòu),探活采用多個(gè)節(jié)點(diǎn)同時(shí)向 master 發(fā)送探測(cè)消息的方式,相對(duì)心跳方式,提高了準(zhǔn)確性。具體由 nameserver 完成,具體流程如下:
關(guān)于 DDMQ 部署安裝,可參照 GitHub 的說(shuō)明。 GitHub 倉(cāng)庫(kù)地址:https://github.com/didi/DDMQ 臧磊,畢業(yè)于北京大學(xué)軟件工程研究所,滴滴出行自研消息中間件 DDMQ 開(kāi)源負(fù)責(zé)人,曾就職于猿題庫(kù)和今日頭條,長(zhǎng)期專注于消息隊(duì)列等基礎(chǔ)設(shè)施的研發(fā)工作。目前在滴滴出行負(fù)責(zé) DDMQ 的產(chǎn)品云化和大數(shù)據(jù)生態(tài)建設(shè)等工作。 江海挺,畢業(yè)于北京大學(xué)軟件工程研究所,滴滴出行自研消息中間件 DDMQ 的產(chǎn)品負(fù)責(zé)人,同時(shí)對(duì)于開(kāi)源的 Kafka 和 RocketMQ 等消息系統(tǒng)的架構(gòu)設(shè)計(jì)、運(yùn)行維護(hù)有著深入的理解和豐富的經(jīng)驗(yàn)。 |
|
|