龔興興 王驁
(1中國電子科技集團公司第五十四研究所,河北石家莊050081)
(2 云南大學云南昆明 650031)
基于動態(tài)推送技術(shù)的網(wǎng)絡(luò)服務(wù)設(shè)計與實現(xiàn)
龔興興1王驁2
(1中國電子科技集團公司第五十四研究所,河北石家莊050081)
(2 云南大學云南昆明 650031)
隨著時代的進步,越來越多的人習慣于使用手機或者平板電腦等智能手持設(shè)備進行業(yè)務(wù)處理和通信,而在國內(nèi)外也涌現(xiàn)了很多在各種移動設(shè)備上使用的軟件,但是隨著用戶對數(shù)據(jù)獲取實時性要求的加強,普通的人工刷新方式已經(jīng)無法滿足。而采用推送的方式,無疑可以解決這一問題,通過服務(wù)器和客戶端維持網(wǎng)絡(luò)連接的方式來實時的獲取更新數(shù)據(jù)[1]。那么針對推送技術(shù)的特點,對基于動態(tài)推送的網(wǎng)絡(luò)服務(wù)進行了劃分,設(shè)計并實現(xiàn)了一套服務(wù)架構(gòu)。
智能手持設(shè)備 實時性 網(wǎng)絡(luò)服務(wù) 推送技術(shù)
隨著科技的進步時代的發(fā)展,智能手機和平板電腦越來越普及,而應(yīng)用在這些設(shè)備上的軟件也越來越多,而其中更不乏支持網(wǎng)絡(luò)消息的離線訪問以及推送的功能。這些軟件大部分都采用開發(fā)式的架構(gòu)模式,這樣可以使大量的數(shù)據(jù)篩選和消息的離線查看變得更為方便和容易實現(xiàn)。隨著企業(yè)信息化的加快和業(yè)務(wù)的需要,傳統(tǒng)的依靠手動獲取數(shù)據(jù)以及消息的方式變得已經(jīng)不能滿足用戶的要求,這樣就出現(xiàn)了推送技術(shù),它通過服務(wù)端和客戶端保持一定網(wǎng)絡(luò)連接的方式來使服務(wù)能夠主動的找到客戶端,并發(fā)放數(shù)據(jù)。
與普通的腳本框架結(jié)構(gòu)類似,基于Push技術(shù)的框架結(jié)構(gòu)也是異步的,網(wǎng)絡(luò)傳輸?shù)臅r延基本上是可以忽略的。這樣的話,框架就極適用于對數(shù)據(jù)實時性要求很高的場景,假若不依賴于其他第三方軟件或者插件,軟件很難達到這個目的。對于用戶少的情況來講,腳本框架能夠提高瀏覽器的反應(yīng)速度,但是多用戶的場景卻會顯得能力不足,當多用戶協(xié)同工作的時候,很難獲取到其他用戶的數(shù)據(jù)情況。依照舊的模式,如果某個用戶需要獲取當前情況其他用戶的數(shù)據(jù)或者是狀態(tài),需要手動的進行查詢,或者依靠瀏覽器輪詢模式。但是采用推送技術(shù)就能簡單的解決這個問題,瀏覽器或客戶端不需要定時的去查詢服務(wù)器,當服務(wù)器自身發(fā)現(xiàn)有新的數(shù)據(jù)產(chǎn)生,或者其他用戶的狀態(tài)發(fā)生某些變化需要通知某些客戶端的時候,就會主動的去聯(lián)系客戶端,并推送數(shù)據(jù)。這樣就大大地節(jié)約了帶寬,不但能夠提高客戶端和服務(wù)器協(xié)同工作的效率,也同時讓客戶端的速度提高很多,從而為用戶帶來更好的體驗,并且很大程度避免通過輪詢方式所帶來的工作性能的問題?;赑ush技術(shù)的框架有以下幾個優(yōu)點:
①節(jié)省流量,驗證簡潔化:由于客戶端的靜態(tài)元素不需要進行頻繁的刷新操作,這樣就能夠避免和服務(wù)器進行網(wǎng)絡(luò)連接的建立斷開操作,請求的內(nèi)容體頁不需要冗余的頭數(shù)據(jù)信息,使網(wǎng)絡(luò)帶寬的負載明顯降低;于建設(shè)于現(xiàn)有軟件體系結(jié)構(gòu)上:Push框架的主要作用的獲取以及更新有動態(tài)效果的元素,服務(wù)器端將實時數(shù)據(jù)由數(shù)據(jù)源服務(wù)器獲取之后,將其作為服務(wù)的返回內(nèi)容發(fā)布,客戶端獲取到數(shù)據(jù)后自動做動態(tài)更新的操作;③與Ajax框架相結(jié)合,程序的可修改性強:現(xiàn)有Web2.0框架和Ajax腳本框架讓網(wǎng)頁用戶的體驗更接近桌面應(yīng)用程序,而Push框架與Ajax腳本框架的結(jié)合提供了實時信息傳送的更佳方式,這就展現(xiàn)了一種更高性能也更易于修改的架構(gòu)方式。
對于一般的Web程序來說,都是基于頁面刷新的,在刷新的過程中,瀏覽器或者客戶端會堵塞等待,當數(shù)據(jù)傳送完畢,瀏覽器或者客戶端才能夠去解析數(shù)據(jù)并刷新頁面,將結(jié)果顯示給用戶,這樣的結(jié)構(gòu)給用戶帶來的體驗是極其不好的,因為數(shù)據(jù)量一旦很大的話,時間就會很長,因為是完全異步的結(jié)構(gòu),頁面會堵塞,所以無法提升刷新效率。Ajax腳本被引進來解決部分網(wǎng)頁元素獲取的問題,由于服務(wù)器產(chǎn)生新數(shù)據(jù)這個事件也是實時發(fā)生的,所以如果Ajax腳本要實時獲取數(shù)據(jù)就只能依靠輪詢這種操作,盡量減少其間隔時間,但是時間間隔的縮短又會帶來帶寬的大量浪費,這對于用戶來講是不可接受的,而頻繁的建立和鍛煉網(wǎng)絡(luò)連接也會導致系統(tǒng)負載上升和性能下降。因此,推送技術(shù)被提出。
采用推送技術(shù)的Web應(yīng)用模型,稱之為Comet框架,在這種框架的設(shè)計下,網(wǎng)絡(luò)請求會被在發(fā)送至服務(wù)器的同時保存下來,并保持一個很長的生存期[2],它通過服務(wù)器的延時并將更新數(shù)據(jù)以流的方式發(fā)送給瀏覽器或者客戶端,這樣采用服務(wù)器主動的方式引入到Ajax框架中,Web服務(wù)器可以在沒有網(wǎng)絡(luò)請求的情況下,找到需要獲取數(shù)據(jù)的客戶端或瀏覽器,并向其傳送數(shù)據(jù),而客戶端接收到數(shù)據(jù)的同時,由腳本或者后臺程序處理,直接呈現(xiàn)給用戶,這樣,數(shù)據(jù)的傳送和顯示完全是異步的,只要服務(wù)器一直保有網(wǎng)絡(luò)連接,就能夠一直向客戶端推送數(shù)據(jù),并使其進行相應(yīng)的操作,而且能夠適應(yīng)任意高低的頻率達到時延小冰球帶寬占用少的目的,讓客戶端或瀏覽器達到真正意義上的實時刷新。按照實現(xiàn)的方法,可以將Comet的實現(xiàn)方法分為2大類:使用HTTP流和使用長輪詢技術(shù)的。
(1)使用HTTP流實現(xiàn)的Comet
使用HTTP流模式的方式,會存在一個具有持久性連接的請求,而對于所有到達服務(wù)器的事件,都會通過這個連接來進行發(fā)送。因此只要將這個連接和其他的不同回應(yīng)分開就行,從技術(shù)來講,常見的2種流技術(shù)包括Forever Iframe,或者被用來在JavaScript中創(chuàng)建Ajax腳本請求的XMLHttpRequest對象。Forever Iframe方式是由一個放在頁面中隱藏的Iframe標簽來完成,這個標簽可以指向服務(wù)器端的網(wǎng)絡(luò)服務(wù)端口,每次有事件出現(xiàn)的時候端口就會寫入并給出一個新的腳本標簽,而標簽的內(nèi)部就攜帶有腳本代碼,Iframe中的內(nèi)容就會被這些腳本代碼來進行更新[3]。這種技術(shù)實現(xiàn)起來較為簡單,并且使用范圍廣,只需瀏覽器支持Iframe標簽,其缺點是沒有跟蹤網(wǎng)絡(luò)連接狀態(tài)和錯誤處理的機制。
第二種技術(shù)相對第一種要可靠一些,是采用XMLHttpRequest對象為依托,使用Ajax腳本來發(fā)送會話,并使服務(wù)器保持打開,一旦服務(wù)器端有事件時,就立即通過這一連接來進行數(shù)據(jù)發(fā)送,由頁面的XMLHttpRequest來進行應(yīng)答,服務(wù)器端的處理要復雜一些,要設(shè)置多請求以及掛起連接的方法,并且能夠高效地找到掛起的某個連接,向其中寫入數(shù)據(jù)。這種方式的優(yōu)點是只要在瀏覽器和服務(wù)器之間帶開一個連接,而缺點是不一定所有瀏覽器都支持。
(2)使用長輪詢技術(shù)實現(xiàn)的Comet
使用長輪詢模式來實現(xiàn)Comet框架,比較推薦的做法是使用Ajax腳本作為客戶端請求發(fā)起者,這樣做的優(yōu)點是客戶端比較容易實現(xiàn)錯誤處理以及超時管理,能夠找到和服務(wù)器之間的連接,也能夠干涉連接。這種技術(shù)還允許服務(wù)器和客戶端之間的連接存在往返,即便連接不上持久的。它能夠應(yīng)用在幾乎所有瀏覽器上,需要做的就是確保所使用用到的XMLHttpRequest對象能夠發(fā)送簡單的腳本請求就可以了。實現(xiàn)上,由XMLHttpRequest對象打開一個到服務(wù)器的網(wǎng)絡(luò)請求并等待響應(yīng),而服務(wù)器需要提供一些特定的服務(wù)允許請求掛起等待,一旦服務(wù)器產(chǎn)生了需要返回客戶端的新數(shù)據(jù),服務(wù)器就會從掛起的請求中找出對應(yīng)客戶端的連接并送回響應(yīng)數(shù)據(jù),當請求超時后關(guān)閉此連接,就像關(guān)閉了網(wǎng)絡(luò)端口響應(yīng)的輸出流一樣,然后客戶端會重新打開一個新的長生存期網(wǎng)絡(luò)請求重復這一過程。但其缺點是,這樣依然依賴于無狀態(tài)的HTTP連接,要求服務(wù)器端有特殊的服務(wù)來臨時掛起連接。
5.1 系統(tǒng)通訊模型
以下將以某系統(tǒng)設(shè)計為案例對推送技術(shù)的具體應(yīng)用方法進行說明概括,系統(tǒng)的架構(gòu)采用C/S和B/S相結(jié)合的方式,設(shè)計上按照物理分層為3個部分,分別為服務(wù)器端、客戶端和通訊層。
服務(wù)器端采用現(xiàn)行服務(wù)器,并且使用線程池和對象池進行配置,客戶端的請求每發(fā)生一次就從服務(wù)器線程池中借用一個線程,事件處理完畢這個請求就將線程返回給線程池。同樣的,使用線程快速的訪問對象,對象也是從對象池中借用,用完就返回對象池,這樣就很大程度節(jié)約服務(wù)器的性能開銷。服務(wù)器和客戶端的通訊狀況如圖1所示。
圖1 服務(wù)器和客戶端的通訊狀況示意圖
5.2 系統(tǒng)通訊過程
如圖1中所示,由Servlet提供請求、響應(yīng)模式的網(wǎng)絡(luò)服務(wù)接口,它能夠動態(tài)的擴展容器服務(wù)器的能力,請求響應(yīng)過程可以概括為:①客戶端發(fā)送網(wǎng)絡(luò)請求至服務(wù)器;于服務(wù)器將請求內(nèi)容按格式轉(zhuǎn)交給Servlet進行邏輯處理;③Servlet接口生成響應(yīng)消息并將其傳給服務(wù)器;④服務(wù)器將響應(yīng)數(shù)據(jù)返回客戶端。
一個網(wǎng)絡(luò)端口被客戶端發(fā)送來的第一個請求激活,然后它將繼續(xù)運行于后臺,等待以后的請求,每個請求會生成一個新的線程,而不是一個完整的進程,而Comet內(nèi)核使用Servlet作為對外交互的接口。
5.3 Comet實現(xiàn)流程
首先,建立網(wǎng)絡(luò)服務(wù)接口,并使此網(wǎng)絡(luò)服務(wù)接口實現(xiàn)服務(wù)器提供的Comet管理接口,Comet管理接口完成了允許網(wǎng)絡(luò)服務(wù)器接收了網(wǎng)絡(luò)請求并執(zhí)行完畢后卻不被回收,服務(wù)器建立對于當前網(wǎng)絡(luò)請求的引用,這樣當產(chǎn)生事件時找到引用并發(fā)送數(shù)據(jù)。網(wǎng)絡(luò)服務(wù)接口必須實現(xiàn)的方法包含event(),參數(shù)就是Comet事件,這個事件分別具有begin()、read()、error()、和end()四個狀態(tài),在begin()和error()或者end()之間,在網(wǎng)絡(luò)服務(wù)端口中能夠按常規(guī)方式引用網(wǎng)絡(luò)請求以及響應(yīng)對象,所以只需要在這些方法中將網(wǎng)絡(luò)響應(yīng)對象有效的管理起來,就能夠達到管理網(wǎng)絡(luò)長連接的目的。
其次,在網(wǎng)絡(luò)服務(wù)接口的方法中增加對網(wǎng)絡(luò)請求和響應(yīng)對象的處理,并添加相應(yīng)的觸發(fā)處理方法。開發(fā)服務(wù)器端應(yīng)用的數(shù)據(jù)處理流程,具體流程和業(yè)務(wù)相關(guān),并在Comet事件的幾個狀態(tài)中添加相應(yīng)的處理邏輯。
最后,軟件的客戶端菜啊用推送的實現(xiàn)技術(shù),在原有軟件的頁面部分添加腳本,由腳本來完成網(wǎng)絡(luò)連接的發(fā)起以及數(shù)據(jù)的接收和頁面的內(nèi)容修改動作。瀏覽器的內(nèi)置對象能夠監(jiān)測當前網(wǎng)絡(luò)請求的狀態(tài),當請求的狀態(tài)處于數(shù)據(jù)接收過程時,可以調(diào)用頁面元素修改函數(shù)來進行內(nèi)容的變動,當請求斷開時,一定時間內(nèi)再次發(fā)起連接等。
5.4 長連接的管理
由于推送技術(shù)需要保管所有來自客戶端的網(wǎng)絡(luò)請求,此時就對服務(wù)器端對這種長連接的管理提出了較高的要求,其中,需要進行管理的長連接類型包括:設(shè)備客戶端的長連接和頁面端的長連接,并且要對這些連接的快速查找和數(shù)據(jù)發(fā)送異常進行高效的處理。
為了能夠高效地確定客戶端連接,可以采用哈希表管理的方法,為哈希表設(shè)置空間長度以及哈希表的自動擴容[4],連接的管理交由專門的連接管理器進行,連接管理器主要實現(xiàn)了3個方法:①網(wǎng)絡(luò)連接的添加,也就是當客戶端有新的網(wǎng)絡(luò)請求時,對此網(wǎng)絡(luò)請求進行唯一性標識,并存儲其句柄;于網(wǎng)絡(luò)連接的刪除,也就是當數(shù)據(jù)的傳送出現(xiàn)異常或者錯誤的狀況時刪除對應(yīng)的網(wǎng)絡(luò)請求的句柄;③網(wǎng)絡(luò)連接的高效查詢,也就是當服務(wù)器有新的數(shù)據(jù)需要進行推送時,要根據(jù)篩選條件快速找到需要數(shù)據(jù)的網(wǎng)絡(luò)請求的句柄。而當服務(wù)器給客戶端發(fā)送消息時,需要對消息進行一系列的邏輯操作,這就需要服務(wù)器有一套完整的消息處理策略,由于客戶端不確定是無線或者有線網(wǎng)絡(luò),數(shù)據(jù)就會存在極大的不穩(wěn)定性,可能因為各種原因無法到達目的地,這時就會調(diào)動服務(wù)器的異常處理機制。
采用推送技術(shù)最大的問題就在于服務(wù)器的負載能力,對于相同的客戶端可以限制其最大網(wǎng)絡(luò)訪問數(shù)量,但是不同的客戶端要保持多個長連接,就要對每個客戶端打開一個TCP端口來保持持續(xù)請求不能釋放,這就對服務(wù)器的性能提出了很高的要求[5],服務(wù)器可能會因為自身內(nèi)存或者其他問題導致端口數(shù)量打開過多無法關(guān)閉而出現(xiàn)內(nèi)存泄露等異常。對于長連接的管理,可以在WEB容器段設(shè)置網(wǎng)絡(luò)連接訪問的時間,當時間超過某個界定值時,就自動對其關(guān)閉。但這樣帶來的問題也顯而易見,如果時間太短,就不能達到使用長連接的目的,而如果太長,則容易導致空閑連接的大量存在,所以需要在時間和數(shù)量之間取得一個平衡點。對于Web容器本身,其性能的提高是非常有限的,所以可以考慮用其他專門做網(wǎng)絡(luò)連接處理的服務(wù)器作為Web容器的前端,采用負載均衡的技術(shù)分流網(wǎng)絡(luò)請求,達到提高服務(wù)器性能的目的[6]。
本文詳細介紹了推送技術(shù)以及在應(yīng)用中推送技術(shù)框架的實現(xiàn)方法。推送技術(shù)的應(yīng)用在信息獲取方式領(lǐng)域是一次革命,它改變了傳統(tǒng)的獲取方式,使應(yīng)用系統(tǒng)具有更好的主動性以及更高的工作效率[6],隨著更多企業(yè)應(yīng)用系統(tǒng)信息化進程的加快,推送技術(shù)也必將得到更多有效的應(yīng)用。
[1]姜毅,王兆青,曹麗.基于HTTP的實時信息傳輸方法[J].計算機工程與設(shè)計,2008,29(10):2451-2454.
[2]李慶誠,商盛立.手持閱讀終端電子資源Push系統(tǒng)設(shè)計與實現(xiàn)[J].計算機工程與設(shè)計,2009,30(6):1483-1490.
[3]曾維宇,陳鐵軍,孟麗.基于Push技術(shù)的主動信息服務(wù)系統(tǒng)設(shè)計與實現(xiàn)[J].計算機工程與設(shè)計,2005,26(11): 2893-2894,2933.
[4]錢宇虹.淺析Comet技術(shù)在Java Web實時系統(tǒng)開發(fā)中的應(yīng)用[J].軟件工程師,2010(4):45-47.
[5]尤淑輝,唐文彬,郭梅.基于Pushlet的網(wǎng)絡(luò)性能實時監(jiān)控系統(tǒng)[J].計算機工程與設(shè)計,2008,23(4):387-388,391.
[6]周順.面向Web Service的動態(tài)負載均衡設(shè)計與實現(xiàn)[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