
摘 要:隨著Ajax技術(shù)的興起,越來越多的應(yīng)用從桌面搬到了瀏覽器。然而HTTP協(xié)議的無狀態(tài)特性使得它很難應(yīng)用于實(shí)時系統(tǒng),例如:實(shí)時股票行情,即時通信,即時報價等。本文分析了Web實(shí)時系統(tǒng)中輪詢的兩種方式以及遇到的問題,提出了使用Comet的解決方法和和將數(shù)據(jù)緩存到應(yīng)用層的解決方法。這些方法能夠提高實(shí)時系統(tǒng)的訪問效率,減輕數(shù)據(jù)庫訪問的壓力。
關(guān)鍵詞:Ajax輪詢;Web實(shí)時系統(tǒng)
中圖分類號:TP311.52 文獻(xiàn)標(biāo)識碼:A 文章編號:1674-7712 (2014) 12-0000-02
HTTP協(xié)議是Internet上大部分信息交換的基礎(chǔ)。請求/響應(yīng)使它成為了經(jīng)典的Web系統(tǒng)模型,它的每個連接使用一個線程,因此保證了Web服務(wù)器能夠快速為瀏覽器端的請求提供服務(wù),而且防火墻、代理服務(wù)器不會對HTTP通道端口進(jìn)行限制,所以基于Web的系統(tǒng)就有很大的可伸縮性。在這種模式下,少量的Web服務(wù)器就可以處理很大數(shù)量的用戶請求,對于內(nèi)容管理系統(tǒng)、搜索引擎和電子商務(wù)站點(diǎn)等Web系統(tǒng)而言,這非常適合。
然而,它也有一些局限性。特別是它的無狀態(tài)、單向協(xié)議特征,即請求必須由瀏覽器客戶端發(fā)出,而Web服務(wù)器則只能在對請求的響應(yīng)中發(fā)送數(shù)據(jù),使得它不太適合使用于Web實(shí)時系統(tǒng),例如基于Web的聊天室、股票行情、電子郵件等。
Web實(shí)時系統(tǒng)中,瀏覽器端的數(shù)據(jù)信息需要得到及時更新,那么就要在請求/響應(yīng)過后仍然讓瀏覽器與Web服務(wù)器交互。如今,采用較多的方式是使用Web輪詢。
一、Web輪詢(polling)
Web輪詢是指Web端通過技術(shù)手段循環(huán)向服務(wù)器端發(fā)送請求并得到響應(yīng)數(shù)據(jù)的過程。Web輪詢可以分為傳統(tǒng)輪詢和Ajax輪詢。
(一)傳統(tǒng)輪詢
在Web系統(tǒng)開發(fā)早期常使用標(biāo)簽實(shí)現(xiàn)頁面刷新。該標(biāo)簽需要定義在html的
標(biāo)簽中,例如:它會指示瀏覽器在指定秒數(shù)(10秒)之后重新裝載或重定向頁面。這種輪詢方式相對簡陋,因為當(dāng)頁面沒有新的數(shù)據(jù)要顯示時,不得不重新呈現(xiàn)相同頁面,即便有新數(shù)據(jù)時,頁面的數(shù)據(jù)呈現(xiàn)部分更改很小,其他的大部分內(nèi)容沒有變化。總結(jié)起來,該輪詢方式的缺點(diǎn)在于:1.用戶體驗很差,整個頁面需要不斷刷新;2.對服務(wù)器造成較大壓力,并且造成帶寬的極大浪費(fèi)。(二)Ajax輪詢
Ajax輪詢是一項非常常見的技術(shù),例如,大多數(shù)webmail應(yīng)用程序就是通過Ajax輪詢技術(shù)在新電子郵件到達(dá)時進(jìn)行顯示的。Ajax可以使用JavaScript調(diào)用XMLHttpRequest對象發(fā)出HTTP請求,從而實(shí)現(xiàn)服務(wù)器與瀏覽器之間的異步通信。Ajax隔一段時間就去服務(wù)器請求數(shù)據(jù),每次重新請求不必傳輸整個頁面,從而能夠進(jìn)行增量式的更新。另外使用Ajax輪詢方式需要合理設(shè)置間隔時間,間隔太短,短時間內(nèi)的大量請求會對服務(wù)器造成巨大壓力;間隔太長,服務(wù)器上的新數(shù)據(jù)就需要較長時間到達(dá)客戶機(jī),實(shí)時性不好,所以性能和及時性會產(chǎn)生較大反比。
Ajax輪詢有兩種實(shí)現(xiàn)方式。第一種是使用setTimeout()方法,該方法會從頁面載入后延遲指定的時間去執(zhí)行一個表達(dá)式或函數(shù),可以通過創(chuàng)建一個函數(shù)循環(huán)重復(fù)調(diào)用setTimeout或使用遞歸來實(shí)現(xiàn)重復(fù)的操作。第二種是使用setInterval()方法,該方法是從頁面載入后每隔指定的時間執(zhí)行一個表達(dá)式或函數(shù),它通常和window.clearInterval一起使用。一般來講,如果要求在每隔一個固定的時間后就立馬執(zhí)行某動作,那么最好使用setInterval()方法;而如果不想讓程序產(chǎn)生互相干擾,尤其是每次方法的調(diào)用需要較長時間進(jìn)行處理時,那么最好使用setTimeout()。
二、Ajax輪詢產(chǎn)生的問題
然而Ajax輪詢方法也會產(chǎn)生一些問題(如圖1所示)。因為應(yīng)用服務(wù)器與數(shù)據(jù)庫服務(wù)器通常處于分布式網(wǎng)絡(luò)結(jié)構(gòu)中,所以輪詢過程中,客戶端每對服務(wù)器進(jìn)行一次請求,服務(wù)器上的應(yīng)用(application)都會與網(wǎng)絡(luò)另一端的數(shù)據(jù)庫服務(wù)器發(fā)送數(shù)據(jù)請求。
圖1 普通Ajax輪詢
應(yīng)用服務(wù)器與數(shù)據(jù)庫需要首先建立起socket通信,在通信管道使用傳輸協(xié)議,并且應(yīng)用服務(wù)器存放數(shù)據(jù)的對象也必須要進(jìn)行序列化。因此會造成數(shù)據(jù)庫很大的訪問壓力,這種方法不支持大量的頁面同時輪詢。
三、解決方案
針對上述問題,以Web聊天室實(shí)時系統(tǒng)為例,可以有如下兩種解決方案。
(一)基于Comet的解決方案
Comet方式簡單來講就是一種長連接的http(long lived http)。初始情況下由Browser端主動發(fā)起請求,Server端響應(yīng)回答后并不關(guān)閉連接。在這個期間內(nèi),如果服務(wù)器端有新數(shù)據(jù)服務(wù)器端可以使用同一個連接把要更新的數(shù)據(jù)主動發(fā)送給瀏覽器客戶端。
Comet又有很多種實(shí)現(xiàn)方式,基于 AJAX 的長輪詢方式和基于iframe及htmlfile的流方式。雖然對于單個操作來說,每次只需要新建一個連接,但是由于連接會保持較長時間,對于Web服務(wù)器端的資源的占用要有所增加。所以說這種方案雖然實(shí)時性好、消息延時小、性能好、能支持大量用戶,但是由于瀏覽器長期占用連接,也會喪失了無狀態(tài)高并發(fā)的特點(diǎn)。
(二)基于數(shù)據(jù)緩存的解決方案
可以使用在應(yīng)用服務(wù)器添加數(shù)據(jù)緩存的方案進(jìn)行解決(如圖2所示):
圖2 使用緩存后的Ajax輪詢
首先,在Web容器的application中添加一個數(shù)據(jù)緩存區(qū)用于存放Ajax輪詢的訪問數(shù)據(jù)。具體實(shí)現(xiàn)過程可以使用setAttribute()方法在Web容器的application作用域中添加屬性。例如:通過setAttribute(\"chatRoom\",chatRoom),將chatRoom對象保存到了application中,chatRoom對象中包含在線用戶信息列表和聊天信息列表。
第二,分析實(shí)時系統(tǒng)中需要更新數(shù)據(jù)緩存的業(yè)務(wù)。例如:在Web聊天室系統(tǒng)中,登錄業(yè)務(wù)和離開業(yè)務(wù)都會改變在線用戶信息,另外聊天業(yè)務(wù)會改變聊天室的聊天信息。因此需要在調(diào)用這三個業(yè)務(wù)方法時重新訪問數(shù)據(jù)庫,并將chatRoom對象更新到application緩存中。
第三,應(yīng)用服務(wù)器啟動初始化時,就將chatRoom對象放入到application中,Ajax輪詢時訪問應(yīng)用服務(wù)器中的緩存數(shù)據(jù)。當(dāng)聊天室長時間沒有數(shù)據(jù)更新時,就不必每次都訪問數(shù)據(jù)庫。
因此可以看出這種方法有如下優(yōu)點(diǎn):1.可以有效的減輕數(shù)據(jù)庫的訪問壓力,提高應(yīng)用系統(tǒng)的性能;2.這種Ajax方式只將需要更新的數(shù)據(jù)傳送到瀏覽器頁面,大大降低了傳輸內(nèi)容和時間;3.瀏覽器可以使用JavaScript對傳送回來的數(shù)據(jù)進(jìn)行處理,增量更新頁面數(shù)據(jù);4.因為使用了頁面局部刷新,所以大大提高了用戶的使用體驗。
四、結(jié)束語
本文討論并分析了在Web實(shí)時系統(tǒng)開發(fā)中使用到的傳統(tǒng)輪詢和Ajax輪詢的兩種方式,以及在使用Web輪詢時遇到的問題。提出了使用Comet的解決方法和通過在應(yīng)用服務(wù)器添加數(shù)據(jù)緩存的解決方法。這些方法可以有效的減輕分布式網(wǎng)絡(luò)環(huán)境下數(shù)據(jù)庫的訪問壓力,整體提高了輪詢?nèi)〉脭?shù)據(jù)的效率,為開放環(huán)境下Web實(shí)時系統(tǒng)開發(fā)提供了有效支持。
參考文獻(xiàn):
[1]Andy Zaidman,Nick Matthijssen.Understanding Ajax applications by connecting client and server-side execution traces[J].Empirical Software Engineering,2013,Vol.(02):181-21.
[2]An Experimental Study of AJAX Application Performance.An Experimental Study of AJAX Application Performance[J].Journal of Software,2008(03):30-37.
[3]Cornelia Gy?r?di1,Robert Gy?r?di1.Web 2.0 Technologies with jQuery and Ajax[J].Journal of Computer Science and Control Systems 2009.
[作者簡介]李永鋼(1985-),男,安陽工學(xué)院,華東師范大學(xué)碩士研究生畢業(yè),主要研究方向:面向服務(wù)的軟件架構(gòu)、軟件可靠度量;彭云峰(1982-),男,安陽工學(xué)院,博士,研究方向:Web服務(wù),地理信息系統(tǒng)。