閆佼, 陳建江
(上海順舟智能科技股份有限公司, 上海 201203)
隨著物聯(lián)網(wǎng)(internet of things,簡(jiǎn)稱IoT)[1]技術(shù)的快速發(fā)展,大量智能設(shè)備的信息需要接入到云平臺(tái)進(jìn)行分析處理,而云平臺(tái)接入層的處理效率直接影響物聯(lián)網(wǎng)設(shè)備的信息上報(bào)和控制延時(shí),特別是對(duì)于某些時(shí)延敏感設(shè)備。目前使用分布式、集群技術(shù)對(duì)于設(shè)備并發(fā)連接及數(shù)量規(guī)模有大幅提升,但仍然存在接入層效率的問(wèn)題。
針對(duì)物聯(lián)網(wǎng)數(shù)據(jù)接入服務(wù),研究人員提出了多種實(shí)現(xiàn)方案,大部分引入了基于內(nèi)存的數(shù)據(jù)存取系統(tǒng),例如Tingli Li等提出基于NoSQL的物聯(lián)網(wǎng)數(shù)據(jù)處理框架IOTMDB[2];Suna Yin等提出基于NoSQL的分布式物聯(lián)網(wǎng)數(shù)據(jù)處理框架STNoSQL[3];田野等提出基于NoSQL、REST的物聯(lián)網(wǎng)數(shù)據(jù)存儲(chǔ)與共享策略[4]。
為了提升云平臺(tái)接入層處理效率,本文從系統(tǒng)整體處理效率入手,重點(diǎn)闡述一種基于LibEvent的IO多路復(fù)用調(diào)度模型及綜合使用消息總線技術(shù)、MongoDB和Redis內(nèi)存數(shù)據(jù)庫(kù)的物聯(lián)網(wǎng)設(shè)備接入云平臺(tái)架構(gòu)模型。使用本架構(gòu)模型可大大提高設(shè)備接入及信息命令的處理效率,減少延時(shí),以符合更大范圍的設(shè)備接入應(yīng)用。
基于消息總線及內(nèi)存數(shù)據(jù)庫(kù)的物聯(lián)網(wǎng)設(shè)備接入云平臺(tái)采用分層的體系架構(gòu),從上到下分別為應(yīng)用層、服務(wù)層、數(shù)據(jù)層和設(shè)備接入層,如圖1所示。
應(yīng)用層主要是B/S展示??商峁┯脩糇?cè)、登錄、訪問(wèn)設(shè)備基本信息、對(duì)設(shè)備進(jìn)行控制操作、統(tǒng)計(jì)分析應(yīng)用。
圖1 系統(tǒng)結(jié)構(gòu)圖
服務(wù)層包括各業(yè)務(wù)邏輯模塊、第三方平臺(tái)相互調(diào)用接口、數(shù)據(jù)查詢接口、數(shù)據(jù)挖掘模塊和數(shù)據(jù)層同步邏輯模塊。
數(shù)據(jù)層采用MongoDB、Redis和MySQL融合的方式,分別存儲(chǔ)設(shè)備的實(shí)時(shí)狀態(tài)信息,臨時(shí)連接信息和歷史數(shù)據(jù)及訪問(wèn)記錄信息。
設(shè)備接入層主要滿足設(shè)備接入的實(shí)時(shí)處理需求,具有并發(fā)性強(qiáng),數(shù)據(jù)量大的特點(diǎn),采用IO多路復(fù)用技術(shù)、線程池及負(fù)載均衡技術(shù)。
云平臺(tái)引入消息總線技術(shù)作為內(nèi)部模塊或邏輯塊通信的主要途徑,解決了不同服務(wù)進(jìn)程之間的通訊問(wèn)題。一些服務(wù)向總線上發(fā)送消息,另一些服務(wù)從總線上獲取消息。這種設(shè)計(jì)思想保證了各個(gè)進(jìn)程可以被不同類型的客戶端所接受,同時(shí)也保證了內(nèi)部進(jìn)程通信接口的可擴(kuò)展性和可靠性,從而解除平臺(tái)中各服務(wù)進(jìn)程之間的耦合,以支持大規(guī)模的部署。
云平臺(tái)系統(tǒng)定義了統(tǒng)一的消息格式,將處理設(shè)備連接的驅(qū)動(dòng)服務(wù)、WEB前端B/S服務(wù)、數(shù)據(jù)同步業(yè)務(wù)邏輯、數(shù)據(jù)分析挖掘業(yè)務(wù)邏輯、第三方平臺(tái)接口服務(wù)等模塊有機(jī)整合,同時(shí)最大化地降低了模塊間的耦合,使得整個(gè)系統(tǒng)中的不同業(yè)務(wù)邏輯可使用不同語(yǔ)言開(kāi)發(fā),靈活部署維護(hù),極大地提升了系統(tǒng)的組件化水平。
實(shí)時(shí)的設(shè)備連接信息使用Redis進(jìn)行存取。Redis是NoSQL數(shù)據(jù)庫(kù)的一種,近年來(lái)發(fā)展日益成熟,其存取數(shù)據(jù)基于內(nèi)存,在性能和速度上相比基于磁盤(pán)存儲(chǔ)的傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)具有較大的優(yōu)勢(shì)。Redis本身適用于數(shù)據(jù)變化快且數(shù)據(jù)庫(kù)大小可預(yù)見(jiàn)(適合內(nèi)存容量)的應(yīng)用程序。例如在微博、微信等應(yīng)用中已引入key-value數(shù)據(jù)庫(kù)到其服務(wù)平臺(tái)中[5]。目前國(guó)內(nèi)Redis最大的用戶是新浪,視覺(jué)中國(guó)(MongoDB)、優(yōu)酷、飛信等都在使用NoSQL數(shù)據(jù)庫(kù)對(duì)業(yè)務(wù)進(jìn)行支持[6]。
設(shè)備連接信息包括TCP連接的SOCKET描述符、設(shè)備在線狀態(tài)、連接對(duì)應(yīng)的設(shè)備集合、與業(yè)務(wù)邏輯相關(guān)的輪詢策略等等。這些信息通過(guò)
設(shè)備的狀態(tài)信息使用MongoDB進(jìn)行存取。MongoDB也是NoSQL數(shù)據(jù)庫(kù)的一種,是基于文檔的非關(guān)系性數(shù)據(jù)庫(kù),可以為物聯(lián)網(wǎng)接入云服務(wù)平臺(tái)提供可擴(kuò)展、高性能的數(shù)據(jù)存儲(chǔ)解決方案。
設(shè)備狀態(tài)信息包括設(shè)備的通用屬性和專有屬性,例如燈具設(shè)備的標(biāo)識(shí)、所屬項(xiàng)目等屬于通用屬性;開(kāi)關(guān)狀態(tài)、亮度狀態(tài)等屬于專有屬性。將這些信息保存在基于文檔結(jié)構(gòu)的內(nèi)存數(shù)據(jù)庫(kù)中,不僅可大幅提升存取速度,提升并發(fā)訪問(wèn)的執(zhí)行處理效率,同時(shí)可靈活擴(kuò)展,既便于存放異構(gòu)設(shè)備的不同屬性信息,又方便后續(xù)對(duì)系統(tǒng)的持續(xù)改造升級(jí)。
設(shè)備接入部分是物聯(lián)網(wǎng)云平臺(tái)的關(guān)鍵功能模塊,它負(fù)責(zé)海量設(shè)備的連接維護(hù)、信息處理及控制執(zhí)行等核心業(yè)務(wù)。設(shè)備接入部分的效率直接決定整個(gè)物聯(lián)網(wǎng)云平臺(tái)對(duì)設(shè)備提供服務(wù)的能力和質(zhì)量。本系統(tǒng)引入基于LibEvent的IO多路復(fù)用調(diào)度模型,同時(shí)融入線程池及負(fù)載均衡技術(shù),設(shè)計(jì)了通用接入框架,并盡最大可能發(fā)揮操作系統(tǒng)的并發(fā)處理性能。如圖2所示。
圖2 設(shè)備接入架構(gòu)圖
LibEvent是基于Reactor型事件驅(qū)動(dòng)模式的輕量級(jí)開(kāi)源高性能網(wǎng)絡(luò)庫(kù),其執(zhí)行效率之高得到普遍認(rèn)可,目前已經(jīng)得到廣泛應(yīng)用,比如Chromium、Memcached、Vomit、Nylon、Netchat等。
接入層框架模型使用IO多路復(fù)用技術(shù),可顯著提高程序在大量并發(fā)連接中只有少量活躍的情況下的系統(tǒng)CPU利用率。IO多路復(fù)用技術(shù)復(fù)用文件描述符集合傳遞結(jié)果,同時(shí)在獲取事件時(shí),只需要遍歷被內(nèi)核IO事件異步喚醒而加入Ready隊(duì)列的描述符集合,而無(wú)需遍歷整個(gè)集合。
接入層框架模型使用線程池技術(shù),主要有兩種線程,分別是“主線程”和“工作線程”,主線程有一個(gè),工作線程有多個(gè)。主線程負(fù)責(zé)監(jiān)聽(tīng)網(wǎng)絡(luò)連接,并且對(duì)監(jiān)聽(tīng)到的連接進(jìn)行accept操作,成功后,把相應(yīng)的連接描述符轉(zhuǎn)交給負(fù)載較輕的工作線程處理。工作線程接收到連接描述符后,創(chuàng)建連接資源并將其加入到自己的連接隊(duì)列,負(fù)責(zé)處理該連接的讀寫(xiě)事件。
接入層框架模型按照組件化思想進(jìn)行設(shè)計(jì),對(duì)于海量異構(gòu)設(shè)備進(jìn)行抽象,抽取共性信息作為通用屬性,個(gè)性信息作為專有屬性。使用設(shè)備類型作為標(biāo)識(shí),區(qū)分不同的數(shù)據(jù)格式及控制命令格式,將其轉(zhuǎn)到不同的處理組件進(jìn)行處理。處理的結(jié)果統(tǒng)一更新到Redis和MongoDB數(shù)據(jù)庫(kù)中。
為了保證高效使用內(nèi)存數(shù)據(jù)庫(kù),各工作線程分別與數(shù)據(jù)庫(kù)建立訪問(wèn)連接,線程之間連接信息保持獨(dú)立,更好地發(fā)揮內(nèi)存數(shù)據(jù)庫(kù)的讀寫(xiě)速度優(yōu)勢(shì),提升對(duì)設(shè)備服務(wù)的并發(fā)處理能力。
為了獲取最佳的執(zhí)行效率,設(shè)備接入層的驅(qū)動(dòng)部分使用C語(yǔ)言實(shí)現(xiàn),其它部分邏輯使用JAVA語(yǔ)言實(shí)現(xiàn),為了驗(yàn)證單臺(tái)主機(jī)的連接性能,使用1臺(tái)安裝Ubuntu 14.04 64位操作系統(tǒng)的,具備單核CPU、2G內(nèi)存的阿里云服務(wù)器進(jìn)行部署測(cè)試,接入設(shè)備分別為安裝于實(shí)際項(xiàng)目中的基于4G技術(shù)的路燈控制器、基于NB-IOT技術(shù)的路燈控制器、基于zigbee技術(shù)的集中控制器及路燈控制器。
首先驗(yàn)證云平臺(tái)的設(shè)備接入層功能,設(shè)備上電后,控制指令執(zhí)行正確、心跳指令、設(shè)備響應(yīng)指令正確,通信邏輯正常。然后查看前端展示,確認(rèn)各菜單跳轉(zhuǎn)正確,控制操作動(dòng)作正確,各模塊及數(shù)據(jù)展示表現(xiàn)正常查看前端B/S展示,關(guān)于設(shè)備管理頁(yè)的展示效果如圖3所示。
圖3 設(shè)備管理頁(yè)的展示效果圖
用戶可單獨(dú)或批量地對(duì)設(shè)備進(jìn)行控制操作,同時(shí)設(shè)備信息可實(shí)時(shí)展示及存儲(chǔ),大大方便了對(duì)物聯(lián)網(wǎng)設(shè)備的管理。
平臺(tái)通過(guò)對(duì)設(shè)備信息進(jìn)行收集和處理,同時(shí)對(duì)比歷史數(shù)據(jù)得出能耗統(tǒng)計(jì)數(shù)據(jù),通過(guò)前端B/S進(jìn)行展示,效果如圖4所示。
圖4 前端展示效果圖
用戶可通過(guò)條件查詢各個(gè)地區(qū)、各個(gè)項(xiàng)目的能耗情況,為城市總體規(guī)劃及能源調(diào)配提供真實(shí)數(shù)據(jù)參考。
以智能燈為例,從B/S端對(duì)其進(jìn)行狀態(tài)信息讀取和控制操作,統(tǒng)計(jì)平均響應(yīng)時(shí)間,如表1所示。
從表1可以看出,在用戶執(zhí)行對(duì)設(shè)備操作后,平均響應(yīng)
時(shí)間小于500 ms,在實(shí)際的操作過(guò)程中,可達(dá)到較好的用戶體驗(yàn)。根據(jù)應(yīng)用邏輯,對(duì)設(shè)備的操作及響應(yīng)數(shù)據(jù)的處理都需要進(jìn)行MongoDB和Redis數(shù)據(jù)庫(kù)的操作及多次網(wǎng)絡(luò)通信,但仍達(dá)到了理想的響應(yīng)效果,基本可體現(xiàn)出基于內(nèi)存數(shù)據(jù)庫(kù)的控制云在時(shí)延方面的優(yōu)勢(shì)。
表1 設(shè)備通信性能測(cè)試結(jié)果
為接入海量物聯(lián)網(wǎng)智能設(shè)備,處理設(shè)備信息,對(duì)設(shè)備進(jìn)行控制操作,設(shè)計(jì)了一種基于消息總線及內(nèi)存數(shù)據(jù)庫(kù)的物聯(lián)網(wǎng)設(shè)備接入云平臺(tái)。該平臺(tái)為智能設(shè)備接入及應(yīng)用層展示、分析提供相應(yīng)服務(wù),將數(shù)據(jù)按照使用率進(jìn)行分類,分別存入MongoDB、Redis及MySQL數(shù)據(jù)庫(kù),同時(shí)設(shè)計(jì)了數(shù)據(jù)庫(kù)同步組件,將內(nèi)存數(shù)據(jù)按日志存入MySQL,便于后臺(tái)數(shù)據(jù)分析及處理。平臺(tái)使用消息總線技術(shù),整合不同的業(yè)務(wù)邏輯模塊,使得不同語(yǔ)言實(shí)現(xiàn)的功能模塊可完美融合。云平臺(tái)接入層使用基于LibEvent的IO復(fù)用技術(shù),大幅提升單機(jī)的連接數(shù)及并發(fā)能力。
通過(guò)系統(tǒng)的長(zhǎng)期運(yùn)行及實(shí)際項(xiàng)目應(yīng)用表明,云平臺(tái)系統(tǒng)能夠?qū)崟r(shí)反映設(shè)備的狀態(tài)信息及設(shè)備的使用和運(yùn)行情況,分析設(shè)備數(shù)據(jù)得到有用價(jià)值數(shù)據(jù),為用戶提供數(shù)據(jù)支撐。下一步將繼續(xù)優(yōu)化系統(tǒng),進(jìn)一步挖掘單機(jī)設(shè)備的最大連接能力及并發(fā)能力,將系統(tǒng)組件分布式部署,同時(shí)開(kāi)發(fā)更多數(shù)據(jù)挖掘應(yīng)用,為用戶提供更多更有價(jià)值的信息。
[1] CONTIP. The Internet of Things[J]. Communications Engineer, 2006,4(6):20-25.
[2] Tingli Li, Yang Liu, Ye Tian, et al. A Storage Solution for Massive IoT Data Based on NoSQL[M]//Proceedings of the IEEE International Conference on Internet of Things, 2012:50-57.
[3] Suna Yin, Dehua Chen, Jiajin Le. STNoSQL: Creating NoSQL database on the Sensible Things platform[C]//IEEE Ieee/acis International Conference on Software Engineering, Artificial Intelligence, Networking and Parallel/Distributed Computing, 2016:669-674.
[4] 田野,袁博,李廷力. 物聯(lián)網(wǎng)海量異構(gòu)數(shù)據(jù)存儲(chǔ)與共享策略研究[J]. 電子學(xué)報(bào),2016,44(2):247-257.
[5] 申德榮,于戈,王習(xí)特,等. 支持大數(shù)據(jù)管理的NoSQL系統(tǒng)研究綜述[J]. 軟件學(xué)報(bào),2013(8):1786-1803.
[6] 閆密巧,王占宏,王志宇. 基于Redis的海量軌跡數(shù)據(jù)存儲(chǔ)模型研究[J]. 微型電腦應(yīng)用,2017,33(4):9-11.