黃澤文++雷景生



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