去哪兒網近日宣布開源其内部廣泛使用的消息中間件 QMQ 。QMQ 自2012年誕生以來在去哪兒網所有業務場景中廣泛的應用,包括跟交易息息相關的訂單場景; 也包括報價搜尋等高吞吐量場景。目前在公司内部日常消息 qps 在 60W 左右,生産上承載将近 4W+ 消息 topic ,消息的端到端延遲可以控制在 10ms 以内。
QMQ 主要提供以下特性:
- 異步實時消息
- 延遲/定時消息
- 基于 Tag 的服務端過濾
- Consumer 端幂等處理支援
- Consumer 端 filter
- 死信消息
- 結合 Spring annotation 使用的簡單 API
- 提供豐富的監控名額
- 接入 OpenTracing
- 分布式事務(即将開源)
- 消息投遞軌迹(即将開源)
- 曆史消息的自動備份(即将開源)
架構概覽
下圖是 QMQ 中各元件及其互動圖:
- meta server 提供叢集管理和叢集發現的作用
- server 提供實時消息服務
- delay server 提供延時/定時消息服務,延時消息先在 delay server 排隊,時間到之後再發送給 server
- producer 消息生産者
- consumer 消息消費者

根據圖中的編号描述一下其互動過程
- delay server 向 meta server注冊
- 實時 server 向 meta server注冊
- producer 在發送消息前需要詢問 meta server 擷取 server list
- meta server 傳回 server list 給 producer (根據 producer 請求的消息類型傳回不同的 server list )
- producer 發送延時/定時消息
- 延時時間已到,delay server 将消息投遞給實時 server
- producer 發送實時消息
- consumer 需要拉取消息,在拉取之前向 meta server 擷取 server list (隻會擷取實時 server 的 list )
- meta server 傳回 server list 給 consumer
- consumer 向實時 server 發起 pull 請求
- 實時 server 将消息傳回給 consumer
更多細節可查閱項目文檔。