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