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