MQTT全名為Message Queuing Telemetry Transport,是一種基于TCP/IP協(xié)議上傳輸?shù)妮p量級通信協(xié)議。MQTT協(xié)議是一種消息隊(duì)列傳輸協(xié)議,采用訂閱、發(fā)布機(jī)制,訂閱者只接受自己已經(jīng)訂閱的數(shù)據(jù),非訂閱數(shù)據(jù)則不接受,既保證了必要的數(shù)據(jù)交換,又避免了無效數(shù)據(jù)造成的存儲與處理。因此在工業(yè)物聯(lián)網(wǎng)中得到廣泛的應(yīng)用。
MQTT協(xié)議是物聯(lián)網(wǎng)平臺的最通用協(xié)議之一,也是OneNET平臺的首要設(shè)備接入?yún)f(xié)議。物聯(lián)網(wǎng)平臺必須海量設(shè)備接入,但MQTT接入服務(wù)究竟能同時(shí)支持多少設(shè)備同時(shí)在線呢?了解這個(gè)指標(biāo)能更好地為平臺的運(yùn)維和運(yùn)營提供科學(xué)的依據(jù)。
可是,如何快速簡便地測試最大在線量指標(biāo)呢?如何選取工具和制作腳本呢?
測試性能我們首先想到的是常用的Jmeter和Locust等性能測試工具。但是這些工具的優(yōu)勢在測試服務(wù)的并發(fā)和吞吐量,并不適合當(dāng)前的測試場景。
然后能想到的是利用第三方Jar包或者三方庫實(shí)現(xiàn)的協(xié)議庫,采用多線程啟動設(shè)備。但是壓力機(jī)線程啟動有限,對動則支持幾十萬上百萬設(shè)備接入量的服務(wù)簡直就是杯水車薪,需要多少壓力機(jī)難以估量。
再次能想到的是Select方法批量管理設(shè)備的Socket連接。問題又出現(xiàn)了,Select管理的異步IO也是有極限的,此方法最終還是放棄。
經(jīng)過前面的分析、實(shí)踐最終方法確定,采用異步IO的方式批量模擬設(shè)備連接服務(wù)器,按照一定的頻率上報(bào)注冊報(bào)文,不斷遍歷設(shè)備Socket接收的緩存數(shù)據(jù),解析服務(wù)消息來判斷設(shè)備是否連接成功,并通過周期性上報(bào)心跳來保持設(shè)備持續(xù)在線。實(shí)現(xiàn)細(xì)節(jié)如下:
(1)實(shí)現(xiàn)基礎(chǔ)設(shè)備類:封裝部分MQTT協(xié)議報(bào)文方法,其中包括設(shè)備注冊、訂閱、發(fā)布、心跳等。
MQTT注冊報(bào)文封裝示例(Java)
(2)實(shí)現(xiàn)設(shè)備類:主要記錄設(shè)備注冊狀態(tài)、訂閱狀態(tài)、保活間隔,最重要的服務(wù)消息的解析和響應(yīng)方法,以及設(shè)備連接服務(wù)器的非阻塞Socket(Java中的SocketChanel)
服務(wù)消息解析代碼示例(Java)
(3)實(shí)現(xiàn)程序主體類:管理批量設(shè)備,控制設(shè)備注冊頻率,設(shè)備何時(shí)上報(bào)數(shù)據(jù)、監(jiān)聽服務(wù)下發(fā)數(shù)據(jù),統(tǒng)計(jì)設(shè)備連接數(shù),持續(xù)上報(bào)心跳,保持設(shè)備在線等。具體實(shí)現(xiàn)邏輯如下:
批量初始化設(shè)備列表;
同時(shí)啟動一下三個(gè)線程;
啟動設(shè)備注冊線程,初始化設(shè)備與服務(wù)連接并上行注冊報(bào)文,可根據(jù)設(shè)置,指定當(dāng)前可同時(shí)注冊的設(shè)備數(shù),所有設(shè)備注冊完成后自動退出;
啟動連接統(tǒng)計(jì)線程,周期性統(tǒng)計(jì)設(shè)備連接成功個(gè)數(shù)、訂閱成功個(gè)數(shù)、連接失敗設(shè)備等數(shù)據(jù);
啟動設(shè)備Socket遍歷線程,持續(xù)輪詢每個(gè)Socket的接收數(shù)據(jù),對接收到的數(shù)據(jù)處理和響應(yīng),每輪遍歷完畢對需要對未長時(shí)間未上報(bào)心跳的設(shè)備上行心跳報(bào)文,以達(dá)到設(shè)備保活的目的。
程序主題類接收線程邏輯代碼片段(Java)
完成程序代碼后,測試工具制作完成。
此工具已實(shí)際用于項(xiàng)目性能測試中,可將壓力機(jī)全部可用端口用于最大設(shè)備在線量的測試中,實(shí)際在Linux虛擬機(jī)中幾分鐘內(nèi)完成50000+設(shè)備注冊,并保持設(shè)備長時(shí)間持續(xù)在線。
此工具能最大限度利用壓力機(jī)端口資源,提升測試執(zhí)行效率,對于在線量較大的服務(wù),只需要在更多的壓力機(jī)上運(yùn)行此工具即可。