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