蔣凌燕 李中科


摘要:隨著互聯網+的進一步發展,接入網絡的設備和需要處理的數據均大量增長,對實時響應的要求也越來越高。根據現在各種場景中人和設備的數據獲取、傳輸、處理、存儲的需求,使用各種終端和設備作為數據采集客戶端,設計實現基于node.js的多終端數據采集系統來提供高并發環境下的數據采集服務。通過研究和比較實時通訊技術的各種實現方法,采用WebSocket和node.js作為系統的基礎支撐技術,分析了系統的核心功能包括數據采集、數據存儲、數據顯示與搜索等,完善了系統的架構設計。
關鍵詞:數據采集;多終端;WebSocket;node.js;實時通訊
中圖分類號:TP311? ? 文獻標識碼:A? ? ? 文章編號:1009-3044(2018)31-0006-03
Research on multi-terminal data acquisition system based on WebSocket and node. js
JIANG Ling-yan, LI Zhong-ke
(Nanjing Institute of Industry and Technology, Nanjing 210046, China)
Abstract: With the further development of Internet +, the equipment of access network and the data that need to be processed are all increasing, and the requirement of real-time response is more and more high. According to the demand of large amount of data acquisition, transmission, processing and storage of human and equipment in various application scenarios, using various terminals and devices as data acquisition client, the multi-terminal acquisition system based on node. JS is designed to provide data acquisition service in high concurrency environment. By studying and comparing the various realization methods of real-time communication technology, using WebSocket and node. js as the basic supporting technology of the system, the core functions of the system including data acquisition, data storage, data display and search are analyzed, and the architecture design of the system is perfected.
Key words: data acquisition; multi-terminal; WebSocket; node.js; real-time communication
1 背景
在互聯網+的時代,數據采集系統需要處理的用戶請求不論是數據的規模還是請求頻率都不斷提高,同時對于響應的實時性要求也越來越高,因此為了滿足需求實時推送和及時響應技術在各種軟件系統中大量應用,基于Web的實時通訊技術也在不斷地發展中。傳統數據采集功能主要面向單個應用,存在功能重復、維護復雜、信息交換共享不足等問題。[1]該文對多終端環境下接入各種設備時的數據采集系統實現進行分析、設計與研究。
2 實時通訊相關技術
在瀏覽器和服務器之間的常用實時通信技術有以下幾種:長、短輪詢、長連接,Adobe 的Flash Socket、WebSocket等等。這幾種技術各有特點,適用于不同的情況。
2.1 短輪詢
短輪詢以ajax技術為基礎,通過在客戶端定時發送重復連接請求來獲得新的數據,服務器會立即返回請求,連接時如果客戶端數量較多或者傳輸的數據量較大引起網絡延遲均會產生一些問題,適合在數據規模不大的請求頻率低且一次性請求較多的應用中使用,一般是中小規模的應用,服務器端程序結構簡單編寫容易。
2.2 長輪詢
長輪詢通過在服務器端阻塞用戶的請求延遲返回來保持鏈接,并減少請求的次數,但同時占用一定的服務器資源保持鏈接線程,適合用戶一次請求需要多次發送數據并長時間保持連接的情況,如Web,QQ。長輪詢可以通過ajax技術在服務器端掛起請求來實現,客戶端使用ajax提交請求并建立連接。長輪詢也可以通過iframe實現,主要用于頁面動態刷新,多用于實時聊天和信息推送,采用xml和json來進行數據交換,在穿越防火墻保持鏈接方面兼容性較好,現在使用得非常廣泛,大規模應用系統中成功使用,但對服務器數據處理和網絡連接的負載要求很高,反復建立鏈接開銷大。
2.3 長連接
長連接技術通過服務器發送事件(Server-Sent Events,簡稱SSE)提出的API創建請求,通過發送心跳包來維持鏈接,服務器端和客戶端持續交換數據,服務器維持長鏈接有開銷,同時部分代理和防火墻無法穿透,在gmail及時消息中有使用。長連接技術使用不同于長短輪詢的方式,所建立的連接可以從服務器端主動推送信息到客戶端而不需要客戶端反復發送請求到客戶端,適合服務器大量推送消息的應用場景。
2.4 Flash Socket
Flash Socket是Flash系列的工具提供的實時發送功能可以保持連接,但是非http協議的,也無法穿越防火墻,客戶端也需要安裝插件,適用于已使用Flash系列的工具開發的系統中實現實時發送功能,在客戶端和服務器系統通過socket建立連接進行通訊,這種實時通訊現在網頁游戲互動使用較多。
2.5 WebSocket
HTML5定義了WebSocket協議,目的是在實現服務器實時與用戶交換數據同時維持對服務器資源和網絡帶寬的低耗占用。WebSocket建立在TCP協議的基礎上,和已有的幾種 web實時通信大多采用http協議不同,WebSocket以事件處理的方式建立雙工鏈接,使用很小報文傳送信息從而以較小的代價維持鏈接,實現了瀏覽器和服務器之間的雙向數據推送,為web模式下的大規模高效的數據實時交換提供另一種模式,解決了HTTP協議下的請求響應模式的一些缺點。WebSocket通過onopen,onmessage,onclose和onerror四個事件來處理整個數據交換的過程,瀏覽器端中的腳本程序簡便易行,服務器端的實現各種技術平臺都提供了相應的組件庫支持WebSocket服務器端程序。本質上WebSocket是長期保持鏈接的,適合提供數據采集服務。
3 所采用的技術方案
3.1 服務器技術
該系統服務器端采用node.js技術。在各種服務器技術中,node.js是一個較新的技術,采用最新的編譯技術,適合快速響應易擴展的系統。 Node.js處理用戶請求時采用基于事件的非阻塞處理模式,在服務器端實現單線程模式的大規模并發請求的處理,并保持系統結構的簡單、輕量和高效。通過比較和測試node.js和其他類型的服務器技術如PHP和JAVA WEB等,在數據流量大、并發多但處理流程簡單的情況下適合使用node.js,數據采集系統符合這種特征,因此多終端數據采集系統中選擇node.js作為Web服務器使用。
Node.js處理事件的時候采用“非阻塞”方式來循環處理并發請求,不管是網絡資源還是存儲資源均以事件回調的方式訪問,請求處理過程中通過專用接口訪問文件系統、數據庫、云存儲等資源,為大量并發的數據采集的功能實現提供了有效支持。
3.2 實時數據推送技術
在大規模的數據采集系統中,數據采集終端(用戶)和服務器之間需要長時間保持鏈接并以一定的時間間隔發送數據,在實時數據推送技術方面選擇WebSocket。
WebSocket解決了Web實時化數據雙向推送的效率問題,通過在瀏覽器中建立長期存在和服務器保持數據交換的連接,實現服務器和客戶端之間的一個低耗雙向數據交換,和傳統推送技術比,通過建立TCP連接來實現數據推送的,比傳統技術使用Http連接更加輕量級,可以顯著減少保持連接過程中傳送的數據量。
Socket.IO是node.js提供的開源WebSocket庫,包含服務器端和客戶端的庫,實現了全雙工實時通訊。Socket.IO支持:WebSocket、htmlfile、xhr-polling、jsonp-polling這幾種方式來實現B/S模式下的實時通訊,該文選擇使用WebSocket來實現系統功能。
4 系統重要功能設計
數據采集系統的用戶/設備數據采集功能、數據存儲、數據雙向傳輸、數據顯示和搜索分別設計如下。
4.1 數據采集功能
數據采集模塊可以在瀏覽器中通過使用表單輸入數據,或者從各種設備客戶端獲取原始數據。用網頁表單方式獲取數據可以支持各種移動終端,包括PC電腦、手機、pad等,自適應網頁也可以很好適應多終端的使用環境,通過表單獲取到的數據以WebSocket方式提交到服務器處理;通過各種設備獲取的原始數據可以使用專用接口編寫專用客戶端程序,客戶端程序通過設備接口獲取從各種設備采集的數據,再在客戶端引用 org.java_WebSocket庫等實現Java-WebSocket客戶端程序,從而將從設備中采集的數據提交到服務器,這種方式降低了服務器獲取采集數據的代價,同時盡量減少數據顯示的延遲。系統結構如圖1所示。
4.2 數據存儲功能
數據存儲模塊根據需要可以存儲在客戶端、redis緩存、數據庫、云存儲和文件系統中。
客戶端存儲將部分采集的數據存在本地可以減少數據鏈接傳輸保持的時間和與服務器數據交換的頻率,也可以在客戶端失去網絡連接時作暫存。在網頁表單采集數據的模式下,本地存儲實現可以通過靜態網頁、本地文件存儲或者是HTML5的LocalStorage來實現。瀏覽器本地文件存儲是使用ActiveXObject支持的Scripting.FileSystemObject對象,瀏覽器需要進行專門的設置,且不同的瀏覽器存在兼容性問題;通過HTML5的LocalStorage來實現本地存儲有5MB的限制,一般情況下也足夠使用了。java-WeSocket專用客戶端(手機端或者嵌入式設備)可以通過文件或者本地的數據庫如sqlite等方式來本機存儲數據。
服務器端存儲實現方式多種多樣,可以通過redis緩存、文件系統、數據庫、云存儲等方式,按數據是否穩定來使用redis緩存和數據庫及文件系統存儲,在高頻數據采集系統中使用redis緩存可以有效地減少服務器負荷,提高響應時間。
數據存儲如圖2所示。
4.3 基于socket.io實現數據雙向傳輸功能
Socket.io作為node.js技術中封裝實時通訊的模塊,支持多種類型的終端設備,可以在瀏覽器和服務器端調用,在瀏覽器中通過引入腳本庫文件,創建socket對象和服務器建立連接,接著使用socket注冊message事件并定義回調函數,當服務器通過socket連接發送消息時調用回調函數處理數據并顯示到頁面中,也可以自定義事件,并注冊到服務器上去。
服務器端使用socket.io時,首先創建服務器對象,接著創建socket模塊中的監聽服務器,定義監聽的端口,調用listen方法開始監聽,對瀏覽器客戶端發送來的各種事件和消息進行處理,最后使用emit方法發送返回結果給瀏覽器。Socket.io支持TCP、UDP、HTTP各種協議,可以根據具體需要按消息處理和轉發的過程來選擇相應的協議,定義事件和回調函數完成服務器和瀏覽器之間的通訊過程處理。
node.js以非阻塞異步單線程方式處理用戶請求,但當有需要大量計算或者耗時較長的任務處理時會顯著降低系統的響應時間,對于這類cpu高占用任務需要單獨進行優化處理,使用cluster模塊進行進程管理。
4.4 數據顯示、查詢功能
在數據顯示模塊,根據用戶的需求來顯示實時數據或者歷史數據。顯示實時數據時系統中的服務器和顯示終端(瀏覽器)之間通過WebSocket維持長鏈接,接受數據時顯示終端會立即部分刷新內容,大大降低了Web模式下從采集終端到顯示終端的顯示延遲,同時,在顯示終端存儲部分臨時數據,既可以作為數據備份,也可以減少數據服務器發送的數據。
數據查詢功能分為客戶端頁面內數據查詢和服務器端查詢兩種,具體設計時根據實際情況來調用不同的查詢模塊,頁面內查詢不用連接數據庫,通過腳本在頁面內完成為小范圍內查詢實時數據提供了便捷,服務器端查詢可以查詢redis緩存、數據庫、文件系統以及云存儲中的數據,適合復雜功能大量數據的查詢。
5 結束語
在B/S模式下進行實時通訊有多種技術方案可選,適合不同的需求場景。在對各種技術進行分析比較研究后,按照實時數據采集系統的特征和需求,采用node.js和html5支持的WebSocket實現系統功能是切實可行的,對系統的核心功能包括數據采集、數據存儲、數據顯示查詢、數據雙向傳遞等功能進行了設計和實現,即在node.js技術和WebSocket的支持下實現大量用戶(終端)的實時信息交互功能。
參考文獻:
[1] 杜鵬, 陶洪鑄, 高保成, 等. 面向多應用的通用數據采集技術方案[J]. 電力系統自動化, 2015, 39(1): 26-30.
[2] 殷建軍, 張鐵民, 可欣榮, 等. 面向田園監測的低成本多光譜圖像遠程采集節點設計[J]. 農業工程學報, 2016, 32(13): 118-124.
[3] 牟雅琳, 丁浩哲, 郭茂林, 等. 基于Node.js的大學生自助學習答疑系統的設計與實現[J]. 電腦知識與技術, 2018, 14(21): 107-109.
[4] 仇晶, 黃巖, 柴瑜晗. 基于Node.js中間層Web開發的研究與實現——以微信圖書借閱平臺為例[J]. 河北工業科技, 2017, 34(2): 118-124.
[5] 韓立, 劉正捷, 李暉, 等. 基于情境感知的遠程用戶體驗數據采集方法[J]. 計算機學報, 2015, 38(11): 2234-2246.
[6] 熊才權, 李元, 林松, 等. 基于WebSocket的研討過程控制方法[J]. 湖北工業大學學報, 2018, 33(4): 70-74.
[7] 黃艷庭, 谷玉海, 王菊遠. 基于WebSocket的風電機組Web實時監測系統設計[J]. 設備管理與維修, 2018(13): 67-69.
[8] 金楓. Web前端MVC框架的意義與前端發展方向展望[J]. 電腦知識與技術, 2016, 12(3): 75-77.