龔興興 王驁
(1中國電子科技集團公司第五十四研究所,河北石家莊050081)
(2 云南大學云南昆明 650031)
基于動態推送技術的網絡服務設計與實現
龔興興1王驁2
(1中國電子科技集團公司第五十四研究所,河北石家莊050081)
(2 云南大學云南昆明 650031)
隨著時代的進步,越來越多的人習慣于使用手機或者平板電腦等智能手持設備進行業務處理和通信,而在國內外也涌現了很多在各種移動設備上使用的軟件,但是隨著用戶對數據獲取實時性要求的加強,普通的人工刷新方式已經無法滿足。而采用推送的方式,無疑可以解決這一問題,通過服務器和客戶端維持網絡連接的方式來實時的獲取更新數據[1]。那么針對推送技術的特點,對基于動態推送的網絡服務進行了劃分,設計并實現了一套服務架構。
智能手持設備 實時性 網絡服務 推送技術
隨著科技的進步時代的發展,智能手機和平板電腦越來越普及,而應用在這些設備上的軟件也越來越多,而其中更不乏支持網絡消息的離線訪問以及推送的功能。這些軟件大部分都采用開發式的架構模式,這樣可以使大量的數據篩選和消息的離線查看變得更為方便和容易實現。隨著企業信息化的加快和業務的需要,傳統的依靠手動獲取數據以及消息的方式變得已經不能滿足用戶的要求,這樣就出現了推送技術,它通過服務端和客戶端保持一定網絡連接的方式來使服務能夠主動的找到客戶端,并發放數據。
與普通的腳本框架結構類似,基于Push技術的框架結構也是異步的,網絡傳輸的時延基本上是可以忽略的。這樣的話,框架就極適用于對數據實時性要求很高的場景,假若不依賴于其他第三方軟件或者插件,軟件很難達到這個目的。對于用戶少的情況來講,腳本框架能夠提高瀏覽器的反應速度,但是多用戶的場景卻會顯得能力不足,當多用戶協同工作的時候,很難獲取到其他用戶的數據情況。依照舊的模式,如果某個用戶需要獲取當前情況其他用戶的數據或者是狀態,需要手動的進行查詢,或者依靠瀏覽器輪詢模式。但是采用推送技術就能簡單的解決這個問題,瀏覽器或客戶端不需要定時的去查詢服務器,當服務器自身發現有新的數據產生,或者其他用戶的狀態發生某些變化需要通知某些客戶端的時候,就會主動的去聯系客戶端,并推送數據。這樣就大大地節約了帶寬,不但能夠提高客戶端和服務器協同工作的效率,也同時讓客戶端的速度提高很多,從而為用戶帶來更好的體驗,并且很大程度避免通過輪詢方式所帶來的工作性能的問題。基于Push技術的框架有以下幾個優點:
①節省流量,驗證簡潔化:由于客戶端的靜態元素不需要進行頻繁的刷新操作,這樣就能夠避免和服務器進行網絡連接的建立斷開操作,請求的內容體頁不需要冗余的頭數據信息,使網絡帶寬的負載明顯降低;于建設于現有軟件體系結構上:Push框架的主要作用的獲取以及更新有動態效果的元素,服務器端將實時數據由數據源服務器獲取之后,將其作為服務的返回內容發布,客戶端獲取到數據后自動做動態更新的操作;③與Ajax框架相結合,程序的可修改性強:現有Web2.0框架和Ajax腳本框架讓網頁用戶的體驗更接近桌面應用程序,而Push框架與Ajax腳本框架的結合提供了實時信息傳送的更佳方式,這就展現了一種更高性能也更易于修改的架構方式。
對于一般的Web程序來說,都是基于頁面刷新的,在刷新的過程中,瀏覽器或者客戶端會堵塞等待,當數據傳送完畢,瀏覽器或者客戶端才能夠去解析數據并刷新頁面,將結果顯示給用戶,這樣的結構給用戶帶來的體驗是極其不好的,因為數據量一旦很大的話,時間就會很長,因為是完全異步的結構,頁面會堵塞,所以無法提升刷新效率。Ajax腳本被引進來解決部分網頁元素獲取的問題,由于服務器產生新數據這個事件也是實時發生的,所以如果Ajax腳本要實時獲取數據就只能依靠輪詢這種操作,盡量減少其間隔時間,但是時間間隔的縮短又會帶來帶寬的大量浪費,這對于用戶來講是不可接受的,而頻繁的建立和鍛煉網絡連接也會導致系統負載上升和性能下降。因此,推送技術被提出。
采用推送技術的Web應用模型,稱之為Comet框架,在這種框架的設計下,網絡請求會被在發送至服務器的同時保存下來,并保持一個很長的生存期[2],它通過服務器的延時并將更新數據以流的方式發送給瀏覽器或者客戶端,這樣采用服務器主動的方式引入到Ajax框架中,Web服務器可以在沒有網絡請求的情況下,找到需要獲取數據的客戶端或瀏覽器,并向其傳送數據,而客戶端接收到數據的同時,由腳本或者后臺程序處理,直接呈現給用戶,這樣,數據的傳送和顯示完全是異步的,只要服務器一直保有網絡連接,就能夠一直向客戶端推送數據,并使其進行相應的操作,而且能夠適應任意高低的頻率達到時延小冰球帶寬占用少的目的,讓客戶端或瀏覽器達到真正意義上的實時刷新。按照實現的方法,可以將Comet的實現方法分為2大類:使用HTTP流和使用長輪詢技術的。
(1)使用HTTP流實現的Comet
使用HTTP流模式的方式,會存在一個具有持久性連接的請求,而對于所有到達服務器的事件,都會通過這個連接來進行發送。因此只要將這個連接和其他的不同回應分開就行,從技術來講,常見的2種流技術包括Forever Iframe,或者被用來在JavaScript中創建Ajax腳本請求的XMLHttpRequest對象。Forever Iframe方式是由一個放在頁面中隱藏的Iframe標簽來完成,這個標簽可以指向服務器端的網絡服務端口,每次有事件出現的時候端口就會寫入并給出一個新的腳本標簽,而標簽的內部就攜帶有腳本代碼,Iframe中的內容就會被這些腳本代碼來進行更新[3]。這種技術實現起來較為簡單,并且使用范圍廣,只需瀏覽器支持Iframe標簽,其缺點是沒有跟蹤網絡連接狀態和錯誤處理的機制。
第二種技術相對第一種要可靠一些,是采用XMLHttpRequest對象為依托,使用Ajax腳本來發送會話,并使服務器保持打開,一旦服務器端有事件時,就立即通過這一連接來進行數據發送,由頁面的XMLHttpRequest來進行應答,服務器端的處理要復雜一些,要設置多請求以及掛起連接的方法,并且能夠高效地找到掛起的某個連接,向其中寫入數據。這種方式的優點是只要在瀏覽器和服務器之間帶開一個連接,而缺點是不一定所有瀏覽器都支持。
(2)使用長輪詢技術實現的Comet
使用長輪詢模式來實現Comet框架,比較推薦的做法是使用Ajax腳本作為客戶端請求發起者,這樣做的優點是客戶端比較容易實現錯誤處理以及超時管理,能夠找到和服務器之間的連接,也能夠干涉連接。這種技術還允許服務器和客戶端之間的連接存在往返,即便連接不上持久的。它能夠應用在幾乎所有瀏覽器上,需要做的就是確保所使用用到的XMLHttpRequest對象能夠發送簡單的腳本請求就可以了。實現上,由XMLHttpRequest對象打開一個到服務器的網絡請求并等待響應,而服務器需要提供一些特定的服務允許請求掛起等待,一旦服務器產生了需要返回客戶端的新數據,服務器就會從掛起的請求中找出對應客戶端的連接并送回響應數據,當請求超時后關閉此連接,就像關閉了網絡端口響應的輸出流一樣,然后客戶端會重新打開一個新的長生存期網絡請求重復這一過程。但其缺點是,這樣依然依賴于無狀態的HTTP連接,要求服務器端有特殊的服務來臨時掛起連接。
5.1 系統通訊模型
以下將以某系統設計為案例對推送技術的具體應用方法進行說明概括,系統的架構采用C/S和B/S相結合的方式,設計上按照物理分層為3個部分,分別為服務器端、客戶端和通訊層。
服務器端采用現行服務器,并且使用線程池和對象池進行配置,客戶端的請求每發生一次就從服務器線程池中借用一個線程,事件處理完畢這個請求就將線程返回給線程池。同樣的,使用線程快速的訪問對象,對象也是從對象池中借用,用完就返回對象池,這樣就很大程度節約服務器的性能開銷。服務器和客戶端的通訊狀況如圖1所示。

圖1 服務器和客戶端的通訊狀況示意圖
5.2 系統通訊過程
如圖1中所示,由Servlet提供請求、響應模式的網絡服務接口,它能夠動態的擴展容器服務器的能力,請求響應過程可以概括為:①客戶端發送網絡請求至服務器;于服務器將請求內容按格式轉交給Servlet進行邏輯處理;③Servlet接口生成響應消息并將其傳給服務器;④服務器將響應數據返回客戶端。
一個網絡端口被客戶端發送來的第一個請求激活,然后它將繼續運行于后臺,等待以后的請求,每個請求會生成一個新的線程,而不是一個完整的進程,而Comet內核使用Servlet作為對外交互的接口。
5.3 Comet實現流程
首先,建立網絡服務接口,并使此網絡服務接口實現服務器提供的Comet管理接口,Comet管理接口完成了允許網絡服務器接收了網絡請求并執行完畢后卻不被回收,服務器建立對于當前網絡請求的引用,這樣當產生事件時找到引用并發送數據。網絡服務接口必須實現的方法包含event(),參數就是Comet事件,這個事件分別具有begin()、read()、error()、和end()四個狀態,在begin()和error()或者end()之間,在網絡服務端口中能夠按常規方式引用網絡請求以及響應對象,所以只需要在這些方法中將網絡響應對象有效的管理起來,就能夠達到管理網絡長連接的目的。
其次,在網絡服務接口的方法中增加對網絡請求和響應對象的處理,并添加相應的觸發處理方法。開發服務器端應用的數據處理流程,具體流程和業務相關,并在Comet事件的幾個狀態中添加相應的處理邏輯。
最后,軟件的客戶端菜啊用推送的實現技術,在原有軟件的頁面部分添加腳本,由腳本來完成網絡連接的發起以及數據的接收和頁面的內容修改動作。瀏覽器的內置對象能夠監測當前網絡請求的狀態,當請求的狀態處于數據接收過程時,可以調用頁面元素修改函數來進行內容的變動,當請求斷開時,一定時間內再次發起連接等。
5.4 長連接的管理
由于推送技術需要保管所有來自客戶端的網絡請求,此時就對服務器端對這種長連接的管理提出了較高的要求,其中,需要進行管理的長連接類型包括:設備客戶端的長連接和頁面端的長連接,并且要對這些連接的快速查找和數據發送異常進行高效的處理。
為了能夠高效地確定客戶端連接,可以采用哈希表管理的方法,為哈希表設置空間長度以及哈希表的自動擴容[4],連接的管理交由專門的連接管理器進行,連接管理器主要實現了3個方法:①網絡連接的添加,也就是當客戶端有新的網絡請求時,對此網絡請求進行唯一性標識,并存儲其句柄;于網絡連接的刪除,也就是當數據的傳送出現異常或者錯誤的狀況時刪除對應的網絡請求的句柄;③網絡連接的高效查詢,也就是當服務器有新的數據需要進行推送時,要根據篩選條件快速找到需要數據的網絡請求的句柄。而當服務器給客戶端發送消息時,需要對消息進行一系列的邏輯操作,這就需要服務器有一套完整的消息處理策略,由于客戶端不確定是無線或者有線網絡,數據就會存在極大的不穩定性,可能因為各種原因無法到達目的地,這時就會調動服務器的異常處理機制。
采用推送技術最大的問題就在于服務器的負載能力,對于相同的客戶端可以限制其最大網絡訪問數量,但是不同的客戶端要保持多個長連接,就要對每個客戶端打開一個TCP端口來保持持續請求不能釋放,這就對服務器的性能提出了很高的要求[5],服務器可能會因為自身內存或者其他問題導致端口數量打開過多無法關閉而出現內存泄露等異常。對于長連接的管理,可以在WEB容器段設置網絡連接訪問的時間,當時間超過某個界定值時,就自動對其關閉。但這樣帶來的問題也顯而易見,如果時間太短,就不能達到使用長連接的目的,而如果太長,則容易導致空閑連接的大量存在,所以需要在時間和數量之間取得一個平衡點。對于Web容器本身,其性能的提高是非常有限的,所以可以考慮用其他專門做網絡連接處理的服務器作為Web容器的前端,采用負載均衡的技術分流網絡請求,達到提高服務器性能的目的[6]。
本文詳細介紹了推送技術以及在應用中推送技術框架的實現方法。推送技術的應用在信息獲取方式領域是一次革命,它改變了傳統的獲取方式,使應用系統具有更好的主動性以及更高的工作效率[6],隨著更多企業應用系統信息化進程的加快,推送技術也必將得到更多有效的應用。
[1]姜毅,王兆青,曹麗.基于HTTP的實時信息傳輸方法[J].計算機工程與設計,2008,29(10):2451-2454.
[2]李慶誠,商盛立.手持閱讀終端電子資源Push系統設計與實現[J].計算機工程與設計,2009,30(6):1483-1490.
[3]曾維宇,陳鐵軍,孟麗.基于Push技術的主動信息服務系統設計與實現[J].計算機工程與設計,2005,26(11): 2893-2894,2933.
[4]錢宇虹.淺析Comet技術在Java Web實時系統開發中的應用[J].軟件工程師,2010(4):45-47.
[5]尤淑輝,唐文彬,郭梅.基于Pushlet的網絡性能實時監控系統[J].計算機工程與設計,2008,23(4):387-388,391.
[6]周順.面向Web Service的動態負載均衡設計與實現[J].計算機工程與科學.2010,32(12):152-156.
Design and Implementation of Network Service Based on Dynamic Push Technology
GONG Xing-xing1WANG Ao2
(1 The 54th Research Institute of CETC,Shijiazhuang Hebei 050081,China)
(2 Yun Nan University,Kunming Yunnan 650031,China)
With the progress of the times,more and more people are accustomed to using mobile or table PC to handle the official business and communicate with each other.A large number of software used in various mobile devices is appeared in worldwide,but with the improvement of user real-time requirements of data acquisition,the ordinary artificial refreshing mode cannot meet user requirements.The push mode can solve this problem,which holds the network connections through the server and the client to acquire the update data in real time.Aiming at the characteristics of push technology,this paper describes the devision of network service based on dynamic push,designs and implements a set of service architecture.
intelligent handheld device;real-time;network service;push technologyse
TP311
A
1008-1739(2014)20-63-4
定稿日期:2014-09-26