來自UC的HTTP協議級消息隊列服務組件:UCMQ
UCMQ是一款輕量的HTTP協議級消息隊列服務組件,項目的最初原型來自“張宴”的HTTPSQS。
基本特性:
- 支持標準的HTTP協議( GET/POST方法),支持長連接(keep-alive);
- 請求響應非常快速,入隊列、出隊列速度超過10000次/秒;
- 每個UCMQ實例支持多隊列,隊列通過操作接口自動創建;
- 單個隊列默認限制存儲100w未讀消息,可以不限制(非必要建議限制);
- 可以在不停止服務的情況下便捷地修改單個隊列的屬性(大小限制/只讀鎖/延時隊列/同步頻率);
- 可以實時查看隊列屬性(入隊列數量、出隊列數量、未讀消息數量、消息積壓數量)。
- 每個隊列有獨立的數據文件易管理易搬遷。
常見部署:
UCMQ邏輯架構中通常會涉及到三個角色:生產者(producer)/異步消息隊列(UCMQ)/消費者(consumer),而三者間都以http協議作為通訊方式,如下圖:
【UCMQ部署邏輯架構圖】
【說明】 在整個部署架構中“生產者”和“消費者”都被視為UCMQ的客戶端。“生產者”和“消費者”通過設定的負載均衡機制訪問UCMQ服務端。每個客戶端(生產 者/消費者)均可注冊一個或多個服務端(在客戶端配置文件添加每個UCMQ服務端監聽地址),如果注冊多個則可以“業務容災”和“負載均衡”。
內部結構:
【UCMQ內部結構圖】
【說明】
控制模塊:負責UCMQ內部流程的控制;
主從復制模塊:將數據變更使用binlog方式同步到備機實現容災(本版本暫不實現);
http協議處理模塊:http處理模塊負責http協議的解析和封裝;
libevent網絡事件驅動模塊:負責異步事件的接收和分發;
MQ隊列管理模塊:管理所有隊列的rtag信息和隊列使用狀態信息;
數據存儲模塊:負責消息持久化(當前數據文件mmap到緩存,所以持久化由系統 輔助完成),清理垃圾數據文件(一個隊列中可有多個文件);負責準確和完整的存/取隊列的rtag信息。
存儲設計:
由于HTTP_SQS項目是基于TC存儲數據,眾所周知TC的數據文件是從頭開始map到緩存的,由于數據量的擴大不能被緩存的數據將很大程度上影 響服務的性能和穩定性。所以UCMQ摒棄了TC,使用日志文件方式存儲消息,數據緩存被順序讀取至內存中,且緩存區域隨讀寫指針移動,這樣既節省了內存使 用也保證了性能。設計原理如圖:
【UCMQ存儲設計圖】