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