滴滴開源分散式訊息中介軟體產品DDMQ

滴滴技術發表於2019-01-29

出品 | 滴滴技術

作者 | 訊息服務團隊

滴滴開源分散式訊息中介軟體產品DDMQ

滴滴出行訊息服務團隊近日開源了其內部廣泛使用的分散式訊息中介軟體產品 DDMQ,這是一款致力於提供低延遲、高併發、高可用、高可靠訊息服務的企業級訊息佇列產品。

1.產品特性

DDMQ 具有如下的優秀特性:

  • 低延遲高吞吐:毫秒級延遲,單機百萬條訊息吞吐。

  • 豐富的訊息型別:具備實時訊息、延時訊息和分散式事務訊息。

  • 海量訊息儲存,支援訊息回溯消費:支援 RocketMQ 和 Kafka 作為實時訊息的儲存引擎,使用RocksDB 作為延時訊息的儲存引擎。

  • 秒級延時訊息:支援單條訊息設定精確到秒級的延遲時間,提供普通延時訊息和迴圈延時訊息。

  • 多語言客戶端,提供了主流開發語言SDK,包括PHP, Java, Go, C/C++, Python,在API 上保持著最易使用的 High Level 形式。

  • 多種消費方式:支援通過 Thrift RPC拉取、HTTP 推送和第三方儲存直寫的方式消費訊息。

  • 支援靈活的訊息過濾和轉換功能:通過使用 Groovy 指令碼在服務端進行訊息體的轉換和過濾,能做有效減少客戶端和伺服器的資料傳輸量,減輕客戶端處理訊息的負載。

  • 統一的Web控制檯:方便使用者管理Topic等資源,通過控制檯可以實現配置生產和消費的限流值、消費方式、Groovy指令碼、啟停消費、重置消費進度等功能。

  • 完善的監控配套:提供模組的健康檢查和訊息堆積告警功能。

2.適用場景

訊息佇列作為構建現代分散式應用所必備的基礎設施,有著廣泛的應用場景。

  • 削峰填谷

    在秒殺等場景下會導致短時間流量的暴漲,下游系統會因為缺少保護而過載甚至崩潰。DDMQ提供的海量堆積能力和消費限流能夠確保下游系統的平穩執行。

  • 非同步解耦

    通過上下游系統的鬆耦合設計,可以保證上游系統不會因為下游系統的當機而不可用。確保主流程的正常穩定執行。

  • 順序訊息

    現實中需要保證順序的場景很多,比如訂單系統中訂單建立、支付、退款等流程,均需要保證順序。 DDMQ提供的順序消費功能可以保證訊息的先進先出。

  • 事務訊息

    在微服務的場景下,通過DDMQ的事務訊息能夠達到分散式事務的最終一致性。

3.架構設計

下面這張圖描述了DDMQ 的總體架構。主要包括 Broker Cluster、Producer Proxy Cluster(以下簡稱 PProxy),Consumer Proxy Cluster(以下簡稱CProxy),SDK,Console 等模組。

滴滴開源分散式訊息中介軟體產品DDMQ

Broker Cluster 是DDMQ的訊息儲存層。使用 RocketMQ作為實時訊息的儲存引擎(同時也支援使用Kafka),Chronos則是我們基於 RocksDB自研的延時訊息儲存引擎。

PProxy 是DDMQ的生產代理服務, 內建 Thrift RPC Server,生產 SDK 通過RPC 呼叫將訊息傳送給 PProxy,然後再由PProxy負責將訊息生產到具體的 Broker 中去,在 PProxy 中我們實現了生產限流、重試和訊息批量生產等功能。

CProxy 是DDMQ的消費代理服務,也內建了Thrift RPC Server,當選擇SDK消費時,消費方以 pull 的方式從 CProxy 中拉取訊息,由於 CProxy 中的PullBuffer提前快取了一定數量的待消費訊息,因此消費的延遲很低。如果選擇HTTP方式消費,則直接由CProxy將訊息推送到業務指定的回撥URL地址。在CProxy 中,我們實現了訊息過濾(通過編寫Groovy指令碼)、訊息體轉換(Transit)、重試、消費限流、順序消費內部排序等功能。

Console是DDMQ的控制檯,使用者通過控制檯申請Topic、Group等資源。Topic等資料會持久化到MySQL並推送到 Zookeeper;PProxy和CProxy通過讀取、監聽 Zookeeper 上的Topic和Group 資料來實時控制訊息的生產和消費邏輯。

DDMQ選擇Proxy+SDK的架構,主要有這幾個好處:

  • 方便實現多語言SDK的實現,由於滴滴內部使用的技術棧比較多,將主要邏輯放在 Proxy 上有利於降低 SDK的複雜度,讓SDK的開發速度大大加快。目前在滴滴內部支援PHP, Go , C/C++, Java, Python, Node.js等語言的SDK實現。

  • 儲存層業務無感知,由於Proxy層遮蔽了後面的RocketMQ或Kafka,使得儲存層的切換可以做到業務無感知。

  • 加快新功能迭代速度,新功能的開發都在 Proxy 層實現,降低了SDK的升級頻率。

4.總結

DDMQ 已經在滴滴內部穩定執行了兩年多時間,支撐了網約車、小桔車服、地圖、金融、智慧駕駛、智慧交通、外賣等業務的穩定執行。日訊息流水達到千億級別,整體服務可用性超過5個9。


GitHub 倉庫地址:

github.com/didi/DDMQ

歡迎大家多提issue

滴滴開源分散式訊息中介軟體產品DDMQ

相關文章