黃澤文++雷景生
摘 要 本文分析了目前幾種Web實時通信方案的特點,著重研究了基于WebSocket的實時通信機制。在電能實時監(jiān)測系統(tǒng)中應(yīng)用該機制,使用Jmeter測試其性能,結(jié)果表明WebSocket具有高實時性、低網(wǎng)絡(luò)流量、對服務(wù)器端壓力小的特點。
【關(guān)鍵詞】WebSocket 電能實時監(jiān)測系統(tǒng) Jmeter
社會經(jīng)濟的不斷進步和智能電網(wǎng)技術(shù)的不斷發(fā)展,電力系統(tǒng)規(guī)模不斷擴大,用電需求量也持續(xù)增長。與之伴隨的是用電設(shè)備運行時急劇增長的數(shù)據(jù)量。在物聯(lián)網(wǎng)和智能電網(wǎng)技術(shù)飛速發(fā)展的今天,為了便于用戶實時地掌控管理設(shè)備用電情況,為用戶用電合理地調(diào)度提出決策支持,一種基于Web的用戶側(cè)用電信息實時、精確、可視化的監(jiān)測系統(tǒng)應(yīng)運而生。該電能實時監(jiān)測系統(tǒng)對數(shù)據(jù)傳輸?shù)膶崟r性提出了很高的要求。傳統(tǒng)的實時Web方案存在網(wǎng)絡(luò)延時較高,滿足不了實時性需求;數(shù)據(jù)傳輸耗費大量的網(wǎng)絡(luò)流量,造成帶寬浪費;無法完全做到全雙工通信;不能有效地滿足大量用戶并發(fā)訪問服務(wù)的需求等缺點,從而不能夠滿足電能實時監(jiān)測系統(tǒng)的性能需求。在該系統(tǒng)中采用了一種新的實時Web方案——WebSocket技術(shù),實現(xiàn)了WebSocket傳輸實時用電數(shù)據(jù)的功能。并利用軟件測試工具Jmeter測試其運行時的各項參數(shù)指標,進行評估。
1 傳統(tǒng)的Web實時通信方案
Web應(yīng)用的信息交互方式通常是客戶端通過瀏覽器向服務(wù)器發(fā)送一個請求,服務(wù)器接收處理該請求并返回結(jié)果給客戶端,客戶端瀏覽器將信息呈現(xiàn)。這種機制對于信息變化不頻繁的應(yīng)用尚能應(yīng)對,但對于實時性要求高、海量并發(fā)的應(yīng)用來說,該機制完全不能勝任。在WebSocket規(guī)范出來之前,傳統(tǒng)的實時Web應(yīng)用方案有輪詢(polling)、Comet技術(shù)。
1.1 輪詢技術(shù)
輪詢是最早的一種實時Web應(yīng)用方案,是一種定時的同步調(diào)用??蛻舳讼蚍?wù)器以固定的時間間隔發(fā)出請求,查看是否有新信息需要傳送。輪詢通過頻繁的請求方式來保持客戶端與服務(wù)器端的同步。當客戶端頻繁地發(fā)送請求,而服務(wù)器端可能沒有數(shù)據(jù)更新時,輪詢方式會帶來很多無謂的網(wǎng)絡(luò)傳輸造成帶寬的浪費,也導(dǎo)致了CPU利用率的浪費,所以輪詢其實是一種非常低效的實時方案。
1.2 Comet技術(shù)
Comet是一種基于HTTP長連接、無需在瀏覽器端安裝插件的“服務(wù)器推”技術(shù)。Comet技術(shù)可以細分為三種實現(xiàn)方式,分別是基于長輪詢(long polling)、基于iframe和基于流(stream)的方式。Comet技術(shù)一定程度上提升了系統(tǒng)的實時性能力減少了服務(wù)器的計算工作,并且能夠支持大量用戶。但由于其長期占用連接從而喪失了無狀態(tài)高并發(fā)的特點,具有一定的副作用。
2 基于WebSocket的實時通信
WebSocket協(xié)議是HTML5標準中提出的一種新的協(xié)議,WebSocket設(shè)計的初衷就是要取代輪詢和Comet技術(shù),使得瀏覽器具備實時、雙向通信的能力。WebSocket協(xié)議主要包括兩個階段,其一是瀏覽器與Web服務(wù)器的“握手”階段,其二是基于TCP的數(shù)據(jù)幀傳輸階段。在“握手”階段完成WebSocket連接的建立,連接成功后進行TCP數(shù)據(jù)幀的傳輸。
2.1 WebSocket協(xié)議“握手”階段
在WebSocket的握手階段,瀏覽器與服務(wù)器之間首先通過TCP三次握手建立連接,連接成功后瀏覽器通過HTTP協(xié)議向服務(wù)器發(fā)送請求報文,服務(wù)器接收驗證該請求報文并向瀏覽器返回一個HTTP數(shù)據(jù)包,瀏覽器對該數(shù)據(jù)包進行確認,如果正確,則握手連接建立成功,瀏覽器與服務(wù)器之間建立用于數(shù)據(jù)幀傳輸?shù)腡CP連接。瀏覽器與服務(wù)器端建立連接的過程如圖1所示。
下面是TCP連接建立成功后,瀏覽器向Web服務(wù)器發(fā)送給的HTTP請求的報文:
服務(wù)器接收到客戶端的握手請求報文后,需要對WebSocket子協(xié)議的支持類型和協(xié)議版本進行驗證,并對Sec-WebSocket-Key字段進行處理,具體做法為:將Sec-WebSocket-Key字段加上字符“258EAFA5-E914-47DA-95CA-C5AB0DC85B11”,采用HA-1方法加密,在進行base64編碼后得到結(jié)果,并在應(yīng)答報文中將結(jié)果賦給Sec-WebSocket-Accept字段。服務(wù)器返回給瀏覽器的HTTP應(yīng)答報文如下:
瀏覽器對報文中的返回狀態(tài)碼及Sec-WebSocket-Accept字段進行驗證,如果正確,則握手成功,如此,瀏覽器和服務(wù)器就可以通過專用的TCP連接發(fā)送和接收數(shù)據(jù)。
2.2 TCP數(shù)據(jù)幀傳輸階段
WebSocket只有在第一次握手時數(shù)據(jù)交互比較復(fù)雜,握手成功后,瀏覽器與服務(wù)器之間只傳輸純數(shù)據(jù)。WebSocket按照數(shù)據(jù)幀的標準格式進行數(shù)據(jù)傳輸,數(shù)據(jù)幀由三部分構(gòu)成:控制字節(jié)、控制擴展字節(jié)和傳輸數(shù)據(jù),該數(shù)據(jù)幀的標準格式如圖2所示。
3 WebSocket在電能實時監(jiān)測系統(tǒng)中應(yīng)用
電能實時監(jiān)測系統(tǒng)是一種對一定區(qū)域內(nèi)用電設(shè)備電能能耗以及用電環(huán)境的各項參數(shù)進行實時動態(tài)監(jiān)控的系統(tǒng)。該系統(tǒng)使用無線傳感網(wǎng)絡(luò)實現(xiàn)電能信息(電壓、電流、功率、地理位置、溫度、濕度、光照等)采集功能,利用網(wǎng)絡(luò)通信技術(shù)實現(xiàn)數(shù)據(jù)傳輸功能,利用數(shù)據(jù)庫和Web技術(shù)實現(xiàn)數(shù)據(jù)的處理和實時顯示,而WebSocket技術(shù)正是并發(fā)、實時數(shù)據(jù)查詢的關(guān)鍵技術(shù)。
3.1 電能實時監(jiān)測系統(tǒng)的數(shù)據(jù)采集和傳輸
電能實時監(jiān)測系統(tǒng)的數(shù)據(jù)的采集傳輸部分采用了結(jié)合ZigBee和以太網(wǎng)的數(shù)據(jù)傳輸系統(tǒng),該系統(tǒng)包括ZigBee網(wǎng)絡(luò)和以太網(wǎng)兩部分,如圖3所示,設(shè)計目的是為了將ZigBee網(wǎng)絡(luò)的數(shù)據(jù)包轉(zhuǎn)換成以太網(wǎng)的TCP/IP協(xié)議數(shù)據(jù)包。其中,ZigBee網(wǎng)絡(luò)中,網(wǎng)絡(luò)節(jié)點采集數(shù)據(jù)并以多跳變的方式傳送到ZigBee匯節(jié)點,匯節(jié)點接收、傳送數(shù)據(jù)至網(wǎng)關(guān),網(wǎng)關(guān)對Zigbee數(shù)據(jù)包進行解析,從中提取出有效數(shù)據(jù)并進行協(xié)議轉(zhuǎn)換,將其封裝打包成TCP/IP數(shù)據(jù)包,通過以太網(wǎng)傳送至服務(wù)器。
3.2 服務(wù)器端引入緩存機制
為了減少信息傳輸?shù)难舆t,電能實時監(jiān)測系統(tǒng)在Web服務(wù)器中引入了緩存機制,顯著縮短客戶端和服務(wù)器之間的響應(yīng)時間。緩存機制是一種“用空間換取時間”的方法。傳統(tǒng)的數(shù)據(jù)庫都是硬盤數(shù)據(jù)庫,CPU讀寫硬盤的速率很大程度上制約了數(shù)據(jù)訪問效率。在Web服務(wù)器中使用實時狀態(tài)緩沖區(qū)(Real State Cache)存放,這個緩沖區(qū)實時記錄了最新的電能信息。本系統(tǒng)中實時監(jiān)測的電能信息有:電流、電壓、功率、用電設(shè)備GPS信息、溫度、濕度、光照等,這些電能信息能夠有效反映用電設(shè)備當前的狀態(tài)和環(huán)境,服務(wù)器至客戶端的信息流圖如圖4所示。
當客戶端向服務(wù)器端發(fā)送實時數(shù)據(jù)請求時,服務(wù)器端采用WebSocket技術(shù)向?qū)崟r狀態(tài)緩存區(qū)請求數(shù)據(jù),然后將數(shù)據(jù)以JSON數(shù)據(jù)格式返回給客戶端,在客戶端使用JavaScript解析JSON數(shù)據(jù)。使用緩存機制,一定程度上節(jié)省了訪問數(shù)據(jù)庫的時間,增強了實時性。
3.3 WebSocket在電能實時監(jiān)測系統(tǒng)中的實現(xiàn)
在電能實時監(jiān)測系統(tǒng)的WEB應(yīng)用程序中,服務(wù)器端采用Tomcat 8。Tomcat在7.0.27版本之后加入了對WebSocket的支持??蛻舳耸褂肏TML5,HTML5定義了WebSocket協(xié)議。
3.3.1 服務(wù)器端的WebSocket實現(xiàn)
在服務(wù)器端實現(xiàn)WebSocket的主要過程如下:
(1)創(chuàng)建一個保存有所連接Inbound的集合connections;
(2)在覆寫的MessageInbound類DemoMessageInbound中重寫事件觸發(fā)函數(shù),如表1所示。
(3)將數(shù)據(jù)返回給客戶端:private void broadcast(String message) {...}
這樣,服務(wù)器端就實現(xiàn)WebSocket的功能。此外,在Tomcat8之后,支持注解(annotation)的編程方式。
3.3.2 客戶端的WebSocket實現(xiàn)
客戶端與服務(wù)器端在初始握手時,將HTTP協(xié)議升級為WebSocket協(xié)議,握手成功后,雙方便能以全雙工模式相互傳遞數(shù)據(jù)。同時,HTML5還定義了在JavaScript中使用的WebSocket接口。
客戶端實現(xiàn)WebSocket的步驟如下:
(1)創(chuàng)建一個Socket實例:var socket = new WebSocket("ws://localhost:8080");
(2)使用時間偵聽器處理連接過程中觸發(fā)的事件:
socket.onopen = function(event){...};
socket.onmessage = function(event){...};
Socket.onclose = function(event){...};
(3)在WebSocket處于打開狀態(tài)時,可以向服務(wù)器端發(fā)送消息:
Socket.send(“message from client!”);
在客戶端實現(xiàn)了使用WebSocket與服務(wù)器端雙向通信的功能之后,就能用瀏覽器實時監(jiān)測從用電設(shè)備上采集到的用電信息。在電能實時監(jiān)測系統(tǒng)中,將WebSocket傳輸?shù)男畔⒆鳛閿?shù)據(jù)源,使用百度ECHARTS繪制動態(tài)圖表,調(diào)用百度地圖API在網(wǎng)頁中實時監(jiān)測某區(qū)域用電設(shè)備信息及無線傳感器網(wǎng)絡(luò)實時拓撲關(guān)系。大樓內(nèi)空調(diào)機實時電壓電流數(shù)據(jù)和無線傳感器網(wǎng)絡(luò)的實時拓撲如圖5所示。
4 實驗測試結(jié)果及分析
在本實驗中,利用Jmeter這款Web性能測試工具對電能實時監(jiān)測系統(tǒng)中空調(diào)機實時電能數(shù)據(jù)顯示模塊進行測試。Apache Jmeter可以用于對靜態(tài)和動態(tài)資源的性能進行測試??梢杂糜趯Ψ?wù)器、網(wǎng)絡(luò)或?qū)ο竽M繁重的負載來測試它們的強度或者分析不同壓力下類型下的整體性能。本實驗使用Jmeter得出服務(wù)器端websocket響應(yīng)的圖形結(jié)果和聚合報告。待測試服務(wù)器軟硬件軟硬件配置如表2所示。
在實驗中,通過不斷增加虛擬用戶的數(shù)量,利用Jmeter生成聚合報告和圖形結(jié)果,據(jù)此分析websocket的各項性能指標。表3是對空調(diào)機實時電壓電流數(shù)據(jù)信息顯示頁面增加一個WebSocket采樣器得出的聚合報告結(jié)果。
表3中,Throughtput是指每秒發(fā)生的采樣數(shù),KB/sec是每秒從服務(wù)器端接收到的數(shù)據(jù)量。由表3可以得出,WebSocket的平均響應(yīng)時間很短,最短的平均響應(yīng)時長為0.097s,遠遠小于人的反應(yīng)時間,當同時在線的用戶規(guī)模達到1500時,錯誤比率達到0.06%,此時服務(wù)器端的壓力已經(jīng)較大,但是錯誤率控制在可接受的范圍內(nèi)。由于WebSocket的JavaScript函數(shù)調(diào)用方便,傳輸消息的頭部小,造成的網(wǎng)絡(luò)流量也很小。以上都說明WebSocket能夠很好地支持電能信息顯示的模塊。
5 結(jié)語
WebSocket較之于傳統(tǒng)的Web實時技術(shù),實時性得到了顯著的提升;造成的網(wǎng)絡(luò)流量減少;對服務(wù)器端壓力減少;能夠支持大量并發(fā)用戶。WebSocket在電能實時監(jiān)測系統(tǒng)中也表現(xiàn)出非凡的一面。隨著HTML 5的不斷發(fā)展,WebSocket也將會在Web實時通信領(lǐng)域發(fā)揮更大的作用。
參考文獻
[1]鄭強,徐國勝.The research of WebSocket in server push[A].第九屆中國通信學(xué)會學(xué)術(shù)年會論文集[C],2012.
[2]李代立,陳榕.WebSocket在Web實時通信領(lǐng)域的研究[J].電腦知識與技術(shù),2010(06):7923-7924.
[3]趙晗.基于WebSocket協(xié)議的Web應(yīng)用性能測試[D].合肥:中國科學(xué)技術(shù)大學(xué),2014:22-26.
[4]仇曉靜.基于WEB的遠程監(jiān)控系統(tǒng)實時信息關(guān)鍵技術(shù)的研究[D].南京:南京理工大學(xué),2013:49-61.
[5]陸晨,馮向陽,蘇厚勤.HTML5 WebSocket握手協(xié)議的研究與實現(xiàn)[J].計算機應(yīng)用與軟件,2015(32):129-130.
[6]查爽.基于ZigBee技術(shù)的無線傳感器網(wǎng)絡(luò)網(wǎng)關(guān)研究與實現(xiàn)[D].大連:大連理工大學(xué),2007:3-9.
[7]鄭玲,鄭曉天.基于WebSocket的電力系統(tǒng)實時數(shù)據(jù)更新研究[J].計算機與現(xiàn)代化,2013(01):86-87.
[8]楊建業(yè),耿建平.基于HTML5的實時Web數(shù)據(jù)監(jiān)測系統(tǒng)[J].桂林電子科技大學(xué)學(xué)報,2015(35):137-138.
[9]佘青.利用Apache Jmeter進行Web性能測試的研究[J].智能計算機與應(yīng)用,2012(02):56-57.
[10]易仁偉.基于WebSocket的實時Web應(yīng)用的研究[D].武漢:武漢理工大學(xué),2013:44-58.
[11]林瑤.Web實時數(shù)據(jù)同步研究[D].北京:北京郵電大學(xué),2015:44-46.
[12]楊小嬌.輕量級高并發(fā)Web服務(wù)器的研究與實現(xiàn)[D].南京:南京郵電大學(xué),2014:67-71.
作者單位
上海電力學(xué)院計算機科學(xué)與技術(shù)學(xué)院 上海市 200090