黃 迪,徐 湛,田志剛,職如昕
(1.北京信息科技大學(xué) 信息與通信工程學(xué)院,北京 100101;2.北京信息科技大學(xué) 現(xiàn)代測控技術(shù)教育部重點實驗室,北京 100101;3.清華大學(xué),北京 100084)
物聯(lián)網(wǎng)(IoT)是通信技術(shù)與互聯(lián)網(wǎng)技術(shù)結(jié)合的新產(chǎn)物,它使得越來越多的設(shè)備不斷接入網(wǎng)絡(luò),并產(chǎn)生大量的數(shù)據(jù)。特別是在2021年,物聯(lián)網(wǎng)收集的數(shù)據(jù)和設(shè)備的接入量預(yù)計將比2020年翻一番。海量數(shù)據(jù)接入對數(shù)據(jù)實時響應(yīng)的要求越來越高,傳統(tǒng)的設(shè)備、技術(shù)和應(yīng)用服務(wù)已經(jīng)不能滿足物聯(lián)網(wǎng)的深度發(fā)展??s短接收數(shù)據(jù)的響應(yīng)時間、實現(xiàn)數(shù)據(jù)實時處理以及提高并發(fā)設(shè)備接入數(shù)量等成為物聯(lián)網(wǎng)研究面臨的新挑戰(zhàn)。
在消息代理服務(wù)器研究方面,多數(shù)研究者主要集中在對消息代理服務(wù)器的應(yīng)用上,使用MQTT協(xié)議基于發(fā)布/訂閱的架構(gòu)模式來傳輸數(shù)據(jù)包,并且取得了一定的成果[1-6]。例如文獻[7]結(jié)合Redis和Mosquitto,設(shè)計完成了以MQTT為傳輸協(xié)議的傳遞信息服務(wù)器,具體功能是針對用戶訂閱的數(shù)據(jù)消息實現(xiàn)推送,并具備驗證接入用戶身份、進行安全權(quán)限檢查、話題的自動訂閱、統(tǒng)計熱點話題、監(jiān)控服務(wù)器運行狀態(tài)等功能。文獻[8]開發(fā)了基于MQTT協(xié)議的電力設(shè)備溫度在線監(jiān)測系統(tǒng)。
從上述文獻中可以看出,研究者主要利用消息代理服務(wù)器作為中間媒介,結(jié)合不同軟件實現(xiàn)在不同場景下的數(shù)據(jù)傳輸功能。例如即時通信系統(tǒng)、消息推送系統(tǒng)、多設(shè)備監(jiān)控系統(tǒng)以及智能手表等。主要的目標在于功能的實現(xiàn),而對于中間消息代理服務(wù)器的選擇、整體性能的優(yōu)劣以及適用場景、文件傳輸方法等未有較多的闡述。
在現(xiàn)有的改進方法中,文獻[9]中提出了一種適用于大文件傳輸?shù)膫鬏敺绞?,其方法是將消息作為主體,產(chǎn)生一份拷貝由每個訂閱者進行共享,然后進行統(tǒng)一發(fā)送,從而降低內(nèi)存空間的占用。文獻[10]對Mosquitto內(nèi)部的訂閱樹機制進行了一定的優(yōu)化,提出了一種改進方法。該方法利用鍵樹多重鏈表表示法中的分支節(jié)點思想,實踐于訂閱樹結(jié)構(gòu)中,并且利用哈希表來管理訂閱主題和訂閱者。該方法在性能上有所改善,減小了Mosquitto服務(wù)器在不同消息發(fā)布數(shù)量情況下的時延。雖然上述研究在內(nèi)部機制和傳輸方式上有一定的改善,但缺少對消息訂閱匹配選擇方式以及消息代理服務(wù)器查找接收數(shù)據(jù)的響應(yīng)時間、設(shè)備接入并發(fā)量的測試情況的研究[11-13]。
本文研究的對象是代理服務(wù)器的內(nèi)部訂閱匹配機制,對支持MQTT協(xié)議數(shù)據(jù)收發(fā)的主流服務(wù)器Mosquitto的內(nèi)部機制進行優(yōu)化,綜合運用訂閱樹和哈希表進行信息訂閱的管理,即利用訂閱樹管理字符數(shù)據(jù)信息訂閱,利用哈希表管理JSON格式等文件的精確主題信息訂閱。通過將訂閱方式分類并按照合適的結(jié)構(gòu)進行匹配,減小消息代理服務(wù)器查找接收數(shù)據(jù)的響應(yīng)時間,提升消息代理服務(wù)器并發(fā)接入設(shè)備數(shù)量的性能[14-15]。
在Mosquitto內(nèi)部,topic(主題)和客戶端的所有關(guān)系全部由訂閱樹管理。在訂閱樹中,topic被拆解、分割,然后使用樹狀結(jié)構(gòu)將分割后的片段相連。訂閱樹整體結(jié)構(gòu)如圖1所示,其結(jié)構(gòu)主要表現(xiàn)在以下兩個方面。
樹節(jié)點的含義:在樹的每個節(jié)點中,topic的分級片段都包含在內(nèi)部,每個劃分的片段對應(yīng)訂閱樹的一個節(jié)點。對于每個節(jié)點的topic,其組成結(jié)構(gòu)是:根節(jié)點至該節(jié)點整體的節(jié)點數(shù),節(jié)點分支的指向是該節(jié)點對應(yīng)的訂閱者列表。如圖1所示,圓形結(jié)點表示主題片段,矩形列表示訂閱者。樹的存儲方式:訂閱樹中采用文獻[16]中的“左孩子右兄弟”方法來構(gòu)建,根據(jù)樹結(jié)構(gòu)的相對位置,保存了topic相互之間結(jié)構(gòu)的相對關(guān)系。

圖1 訂閱樹結(jié)構(gòu)
樹結(jié)構(gòu)的劃分:在Mosquitto內(nèi),業(yè)務(wù)子樹和系統(tǒng)子樹組成訂閱樹的兩個部分。其中根結(jié)點的左孩子為業(yè)務(wù)子樹的根節(jié)點;根節(jié)點的右兄弟為系統(tǒng)子樹的根結(jié)點。訂閱者與被訂閱主題之間的聯(lián)系,由業(yè)務(wù)子樹負責(zé),以確保消息轉(zhuǎn)發(fā)業(yè)務(wù)在服務(wù)器內(nèi)正常運行;而系統(tǒng)子樹負責(zé)的是:管理當(dāng)前服務(wù)器的運行時間、客戶端連接數(shù)量、消息轉(zhuǎn)發(fā)總數(shù)、內(nèi)存占比等系統(tǒng)信息。通常情況下,消息訂閱者都存在于業(yè)務(wù)子樹的節(jié)點上。因為所有的客戶端由業(yè)務(wù)子樹管理,它確保服務(wù)器能夠完成消息轉(zhuǎn)發(fā)與推送工作;而系統(tǒng)子樹所面對的是系統(tǒng)管理者,它幫助系統(tǒng)管理者了解當(dāng)前服務(wù)器的運行情況,以便做下一步的決策。
對訂閱樹按照topic搭建后,主題被分割成多部分并儲存在樹中。從樹的根節(jié)點開始到任意節(jié)點所經(jīng)過的軌跡路徑為其中一條主題的訂閱規(guī)則,每個節(jié)點都在管理各自所對應(yīng)的列表。此列表保存著客戶端的數(shù)目和訂閱者的具體信息。因此,訂閱樹的形狀由訂閱主題的數(shù)量和分級直接決定并受其影響,這種影響是至關(guān)重要的,也會進一步影響操作效率。在Mosquitto中,查詢、插入和刪除是訂閱樹的基本操作,而這些操作均會用到對訂閱樹的遍歷[17-18]。
以插入操作為例,首先比較訂閱主題的每個分級內(nèi)容與訂閱樹的各層節(jié)點,依次搜尋能對應(yīng)的節(jié)點。如果能尋找到,則繼續(xù)下一級匹配,一直進行到訂閱的主題全部完成匹配,然后將訂閱內(nèi)容連接到對應(yīng)節(jié)點的訂閱列表中。在匹配過程中若出現(xiàn)內(nèi)容分級匹配無法成功,則說明訂閱樹目前還沒有所需主題。需要將不匹配的節(jié)點添加至訂閱樹中,并將所訂閱的內(nèi)容添加到當(dāng)前已生成節(jié)點的訂閱列表里。
圖2為訂閱樹的具體匹配流程。如果訂閱主題在列表中的當(dāng)前分級不為空,且能夠與訂閱樹節(jié)點內(nèi)容相匹配,則進入到下一個分級并繼續(xù)進行比較。如果訂閱主題在列表中的當(dāng)前分級不為空,且未能與訂閱樹中當(dāng)前節(jié)點的內(nèi)容相匹配,則需要為主題的分級新插入一個節(jié)點,繼續(xù)以新增的節(jié)點作為子樹的根節(jié)點進行下一層的匹配。如果訂閱主題列表為空,則將其添加至當(dāng)前節(jié)點對應(yīng)的訂閱列表中。

圖2 訂閱樹的匹配流程
對于上文所述訂閱樹的訂閱流程和匹配機制,其優(yōu)點是提供了比較清晰的邏輯,對開發(fā)和維護十分有利;但是,當(dāng)每一個客戶端進行插入、查找和刪除操作時,每一個操作對樹都要進行遍歷。如果不斷加大樹的深度,特別是在網(wǎng)絡(luò)狀況差時,客戶端的頻繁重連操作,將導(dǎo)致對訂閱樹的遍歷操作不斷增加,產(chǎn)生較大的響應(yīng)時延,效率較低。
目前的研究主要是使用兩種方法優(yōu)化。第一種是使用前綴樹思想在訂閱樹根節(jié)點的下一個節(jié)點建立索引,按照關(guān)鍵字符進行快速定位,然后快速查找具體匹配主題信息。另一種是將訂閱樹存儲方式轉(zhuǎn)變?yōu)槭褂脦饕1韮Υ妫ㄟ^主題迅速定位訂閱列表,從而實現(xiàn)快速查找和匹配。雖然哈希表從一定程度上減少了訂閱樹的深度,達到了快速查找和匹配到相應(yīng)的訂閱列表的目的,但是持續(xù)增加的訂閱主題量導(dǎo)致哈希表長度不斷加大,在進行主題匹配訂閱時,對主題查找需要進行更多操作,造成效率低下,且不斷添加長的列表也增加了哈希沖突,這就對哈希函數(shù)的構(gòu)造方法提出了更嚴格的要求。
針對Mosquitto訂閱樹的缺陷,并根據(jù)物聯(lián)網(wǎng)實時傳輸數(shù)據(jù)的需求,提出將訂閱樹和哈希表相結(jié)合的優(yōu)化方式。首先將訂閱匹配分為精確訂閱和字符數(shù)據(jù)訂閱。對于精確的主題內(nèi)容使用哈希表精確匹配,對于字符數(shù)據(jù)則使用訂閱樹進行匹配。這種方式的優(yōu)勢體現(xiàn)在:對于精確匹配的主題,文件所含數(shù)據(jù)量會較大,需要對數(shù)據(jù)進行頻繁刪減和查找;而哈希表查找速度快,時間復(fù)雜度幾乎為常數(shù),大大降低了數(shù)據(jù)的存儲和查找消耗的時間,因此能夠很快定位到具體主題下的訂閱列表,提高匹配查找的效率。在具體的哈希函數(shù)的算法選取上,可以根據(jù)精確匹配的場景靈活進行選取,避免因匹配數(shù)量過大導(dǎo)致訂閱誤差。對于字符數(shù)據(jù)匹配,利用訂閱樹結(jié)構(gòu)能有效地減少樹的深度,通過對關(guān)鍵字符的判斷,確定訂閱是單層匹配還是多層匹配,從而在相關(guān)主題下接收對應(yīng)的信息。
具體實現(xiàn)時在源代碼的訂閱部分加入判斷,確定后續(xù)訂閱匹配流程。使用哈希表時,在源代碼中添加合適的哈希函數(shù)和哈希表的結(jié)構(gòu)體,如圖3所示。相比于只使用訂閱樹結(jié)構(gòu),哈希表利用自身特性通過算法函數(shù)將關(guān)鍵碼值映射到表中的一個位置,訂閱者訂閱的主題為表中key值,內(nèi)容則是從根節(jié)點到當(dāng)前節(jié)點共同組成的主題;value值為每個主題對應(yīng)訂閱者列表的地址。通過關(guān)鍵碼值對表直接進行訪問,相比于樹結(jié)構(gòu),可以快速尋找并定位到具體的主題和訂閱列表,從而快速進行匹配。哈希表在實際使用中也更容易控制表的長度,有利于存儲。除了查找匹配,在執(zhí)行插入、刪除數(shù)據(jù)操作時也十分便捷,減少對數(shù)據(jù)操作的時間。

圖3 哈希表組成圖
實驗數(shù)據(jù)的發(fā)布按照MQTT協(xié)議消息發(fā)布的服務(wù)質(zhì)量QoS=1進行設(shè)計。由圖4可以看到,在發(fā)布者發(fā)送數(shù)據(jù)給代理服務(wù)器后,代理服務(wù)器會發(fā)送一個帶有PUBACK(如圖4中虛線框所示)的報文信息,從而確定代理服務(wù)器收到發(fā)布者所發(fā)來的報文。

圖4 QoS=1時的發(fā)布/訂閱流程
在表1所列軟硬件配置的服務(wù)器上搭建客戶端和Mosquitto,完成連接和配置。

表1 軟硬件配置
在服務(wù)器運行正常后,分別對優(yōu)化前后的Mosquitto進行測試。首先測試發(fā)布相同消息時代理服務(wù)器與客戶端訂閱匹配后接收到消息的時間,并增加發(fā)送消息的次數(shù)和消息量,查看性能變化。
見表2所列結(jié)果,通過發(fā)送時間戳并抓包測試客戶端發(fā)布消息后到代理服務(wù)器接收消息之間的時間間隔,經(jīng)過4次測試,每次發(fā)送JSON文件的數(shù)據(jù)量逐漸增大。對比優(yōu)化前后的響應(yīng)時間可以看出,修改后的結(jié)構(gòu)可以有效降低查找接收消息的響應(yīng)時間,平均降幅約為24%。

表2 測試運行結(jié)果對比
對服務(wù)器進行并發(fā)數(shù)測試,利用壓測工具進行4次測試,在5 min內(nèi)均持續(xù)發(fā)送1萬條消息。測試結(jié)果如圖5所示,并發(fā)接入數(shù)在優(yōu)化后明顯好于優(yōu)化前,平均增幅約為10%。

圖5 代理服務(wù)器并發(fā)接入數(shù)性能圖
本文針對所提的方法進行了壓力測試。壓測時CPU占用率的結(jié)果如圖6所示,雖然優(yōu)化后訂閱機制的復(fù)雜度相較于優(yōu)化前有所增加,但增加的復(fù)雜度均能控制在合理水平區(qū)間,不影響服務(wù)穩(wěn)定運行。

圖6 代理服務(wù)器CPU占用率
本文研究了消息代理服務(wù)器Mosquitto訂閱樹機制,分析了訂閱樹機制存在的缺陷,提出了基于訂閱樹和哈希表結(jié)合的優(yōu)化方法,在此基礎(chǔ)上進行了測試驗證。測試結(jié)果表明,優(yōu)化方法可以有效降低消息代理服務(wù)器的響應(yīng)時間,提升設(shè)備接入并發(fā)數(shù)量,使得消息代理服務(wù)器可以用更小耗時接收更多設(shè)備發(fā)送的數(shù)據(jù),有利于減小服務(wù)器使用數(shù)量,使其高效穩(wěn)定運行。下一步的工作將繼續(xù)深入研究不同應(yīng)用場景下的優(yōu)化方法,并降低實現(xiàn)復(fù)雜度。
物聯(lián)網(wǎng)技術(shù)2021年11期