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