新聞中心

EEPW首頁 > 網(wǎng)絡(luò)與存儲 > 設(shè)計應(yīng)用 > Web應(yīng)用中縮短Web響應(yīng)時間的技術(shù)研究

Web應(yīng)用中縮短Web響應(yīng)時間的技術(shù)研究

作者:張曉麗,于海燕 時間:2008-09-25 來源:中電網(wǎng) 收藏

  1 引 言

本文引用地址:http://2s4d.com/article/88374.htm

  性能是應(yīng)用程序成功與否的關(guān)鍵因素,響應(yīng)時間則是性能的一個重要指標(biāo),尤其是從用戶的角度來看,隨著同時訪問的用戶數(shù)的增加,應(yīng)用程序的響應(yīng)時間也會相應(yīng)增加,當(dāng)其增加到用戶無法接受的程度時,用戶便會失去耐心而離開該網(wǎng)站。根據(jù)Zona Research的研究指出,如果使用者等待下載網(wǎng)頁的時間超過8 s,將有30%的用戶選擇停止瀏覽網(wǎng)頁,同樣的研究表明,如果下載網(wǎng)頁的時間縮短1 s,則這個數(shù)字將從30%降低到8%。由此可見終端用戶所感到的時間延遲(user-perceivedlatency)已經(jīng)成為今天Internet的主要性能問題。

  在網(wǎng)絡(luò)帶寬并沒有得到相對擴(kuò)充、網(wǎng)絡(luò)流量絕對增加的情況下,是否能找到一些有效的辦法,縮短整個網(wǎng)絡(luò)對用戶click的響應(yīng)時間。本文針對這一問題,從應(yīng)用程序開發(fā)的角度出發(fā),通過提高Web應(yīng)用程序的性能,從而加速網(wǎng)絡(luò)對用戶的反應(yīng)速度,縮短用戶感知的時間延遲。

  2 Web響應(yīng)時間

  從終端用戶的觀點(diǎn)看,從瀏覽器對網(wǎng)站發(fā)出一個HTTP GET的請求,一直到網(wǎng)站完整地傳回網(wǎng)頁內(nèi)容至瀏覽器的這段過程可以描述為圖1所示的時序圖。

  客戶端和Web之間HTTP信息的傳送是通過TCP連接實(shí)現(xiàn)的。圖1描述Web請求中的所有時間延遲。客戶端向發(fā)送文件請求,首先建立TCP連接(1~3),連接建立后,Web服務(wù)器響應(yīng)且發(fā)送文件至客戶端,客戶端接受文件且在屏幕上顯示出來(4~5)。如果文件中包含圖片或者需要在屏幕上顯示的處理,客戶端瀏覽器就需要發(fā)送請求去檢索獲取這些(6~n)。整個Web頁面在屏幕上顯示,其中可能含有連接,如果用戶點(diǎn)擊連接,瀏覽器就需要使用同樣的過程檢索新的頁面。

  根據(jù)圖1和以上分析,定義如下的概念:

  定義1 用戶感知時間Tuser用戶從瀏覽器對網(wǎng)站發(fā)出一個HTTP GET的請求,直到服務(wù)器完整地回傳網(wǎng)頁內(nèi)容至瀏覽器的這段時間。

  定義2 Web數(shù)據(jù)響應(yīng)時間TWeb設(shè)Tpage為頁面下載時間,Tcontent為內(nèi)容生成時間,則整個頁面的響應(yīng)時間,則:

  如前面所述,在網(wǎng)絡(luò)帶寬并沒有擴(kuò)充的情況下,則式(1)中的Tc這段時間就是固定的,那么提高網(wǎng)絡(luò)性能的關(guān)鍵就是如何縮短Th+Ti,也就是定義2中的Web數(shù)據(jù)響應(yīng)時間TWeb。在本文中,從開發(fā)Web應(yīng)用程序的角度出發(fā),從數(shù)據(jù)訪問、減少網(wǎng)絡(luò)通信量以及緩存3個方面討論縮短Web數(shù)據(jù)響應(yīng)時間的方法,并對這些方法的使用效果作了測試比較。

  3 減少數(shù)據(jù)顯示的響應(yīng)時間

  目前的Web應(yīng)用開發(fā)大多采用基于B/S模式的3層架構(gòu),如圖2所示。

  分層分離了邏輯,使得系統(tǒng)結(jié)構(gòu)層次明晰,系統(tǒng)變得靈活和易于維護(hù)。圖2很好地說明了Web中的分層架構(gòu),同時也描述Web頁面提取數(shù)據(jù)顯示的過程,以下從軟件處理數(shù)據(jù)的角度分別討論如何縮短數(shù)據(jù)訪問及Web數(shù)據(jù)顯示延遲,從而縮短Web數(shù)據(jù)的響應(yīng)時間,減少用戶感知時間,提高用戶的滿意度。

  3.1 數(shù)據(jù)訪問的優(yōu)化

  對數(shù)據(jù)的訪問速度很大程度上影響應(yīng)用系統(tǒng)的性能,如果被請求的頁面是一個靜態(tài)頁面或只有一小部分內(nèi)容需要從數(shù)據(jù)庫中提取,則它的加載速度比那些需要從數(shù)據(jù)庫中大量讀取數(shù)據(jù)或不斷從數(shù)據(jù)庫接收和更新數(shù)據(jù)的頁面要快,因此,對于動態(tài)的頁面來說,對SQL層數(shù)據(jù)處理的優(yōu)化就顯得非常重要。在Web開發(fā)中,除了傳統(tǒng)的改善數(shù)據(jù)庫結(jié)構(gòu)和優(yōu)化SQL語句外,主要從以下的幾個方進(jìn)行優(yōu)化。

  3.1.1 使用XML技術(shù)

  對于普通數(shù)據(jù)訪問數(shù)據(jù)庫而言,在數(shù)據(jù)量不大的情況下,一般性查詢在執(zhí)行速度上,不會有什么問題。每次數(shù)據(jù)提取需要1次網(wǎng)絡(luò)往返,這在應(yīng)用程序處理海量結(jié)果集時會影響性能。比如每次查詢數(shù)據(jù)在十萬數(shù)量級,速度問題就會暴露出來。但是實(shí)際中發(fā)現(xiàn),在匯總統(tǒng)計查詢中,用戶查詢頻繁但變動并不大,因此可以考慮借助XML獲取數(shù)據(jù)來解決上述的問題。

  采用XML技術(shù),可將查詢的結(jié)果生成XML文件保存在Web服務(wù)器上,使客戶端能夠直接和XML文件進(jìn)行交互,以節(jié)省訪問數(shù)據(jù)庫的資源;同時也可以將XML傳送到客戶端,在客戶端恢復(fù)為數(shù)據(jù)集,此后就可以直接在客戶端進(jìn)行一些操作,而不必和服務(wù)器交互,建立非連接的數(shù)據(jù)訪問以節(jié)省時間。這里采用以下的算法過程利用XML技術(shù)實(shí)現(xiàn)對數(shù)據(jù)庫的訪問。

  (1)建立數(shù)據(jù)庫連接,生成查詢結(jié)果數(shù)據(jù)集(DataSet);

  (2)用XmlDataDocument將查詢結(jié)果集(DataSet)以XML形式保存在Web服務(wù)器的指定目錄下,同時斷開數(shù)據(jù)庫連接;

  (3)一旦用戶發(fā)送訪問請求,首先查詢Web服務(wù)器指定目錄下是否有滿足條件的XML文件,如果存在轉(zhuǎn)(4),否則轉(zhuǎn)(1);

  (4)創(chuàng)建XmlDataDocument對象,并用其Load方法加載該XML文件;

  (5)利用XPath或者XQuery查詢技術(shù),查詢已加載的XML文件,生成相應(yīng)的結(jié)果集。

  從上面的過程可以看出,一旦有用戶發(fā)送查詢請求,首先將數(shù)據(jù)庫服務(wù)器中的數(shù)據(jù)轉(zhuǎn)化為XML文檔,保存在Web服務(wù)器上,然后查詢XML文件中的數(shù)據(jù),獲取查詢結(jié)果。之后如果有新的請求查詢相同的記錄時,可以直接從Web服務(wù)器的XML文件中提取數(shù)據(jù)而不用再訪問數(shù)據(jù)庫。這對于用戶頻繁的查詢匯總操作中,優(yōu)勢非常明顯,且效率很高。這種思想在邏輯上將數(shù)據(jù)的生成和操作分開,同時節(jié)省了和數(shù)據(jù)庫服務(wù)器建立連接的時間,將其轉(zhuǎn)換為對服務(wù)器端XMl文件的讀取,有效地減輕了對系統(tǒng)數(shù)據(jù)庫服務(wù)器的負(fù)荷。

  3.1.2 使用連接池

  建立Web應(yīng)用程序與數(shù)據(jù)庫之間的TCP連接時,DBMS需要為其分配多種資源,而在釋放連接時,DBMS需要釋放掉這些資源,分配和釋放資源都是比較耗時的工作,因此反復(fù)建立和釋放連接勢必會影響整個系統(tǒng)的性能。實(shí)際上,大多數(shù)應(yīng)用程序僅使用1個或幾個不同的連接配置。這意味著在執(zhí)行應(yīng)用程序期間,許多相同的連接將反復(fù)地打開和關(guān)閉。為了使打開的連接成本最低,ADO.NET使用連接池的優(yōu)化方法。

  連接池技術(shù)能夠能重用到數(shù)據(jù)庫的連接,而不是每次請求都建立新的TCP連接,新連接僅在連接池中得不到連接時才建立。當(dāng)連接被關(guān)閉時,它被返回到連接池中,在那里它仍然保持與數(shù)據(jù)庫的連接,與完全斷開TCP連接相反。池進(jìn)程保持物理連接的所有權(quán)。通過為每個給定的連接配置保留一組活動連接來管理連接。只要用戶在連接上調(diào)用Open,池進(jìn)程就會檢查池中是否有可用的連接。如果某個池連接可用,會將該連接返回給調(diào)用者,而不是打開新連接。應(yīng)用程序在該連接上調(diào)用Close時,池進(jìn)程會將連接返回到活動連接池集中,而不是真正關(guān)閉連接。連接返回到池中之后,即可在下一個Open調(diào)用中重復(fù)使用。

  池連接可以大大提高應(yīng)用程序的性能和可縮放性。默認(rèn)情況下,ADO.NET中啟用連接池。除非顯式禁用,否則,連接在應(yīng)用程序中打開和關(guān)閉時,池進(jìn)程將對連接進(jìn)行優(yōu)化。

  3.2 表示層的數(shù)據(jù)顯示

  對于優(yōu)化B/S下的數(shù)據(jù)顯示方面,主要考慮數(shù)據(jù)傳輸量的大小,數(shù)據(jù)傳輸量的大小是決定顯示響應(yīng)速度的必要前提,這一點(diǎn)是B/S的弱項(xiàng)。數(shù)據(jù)傳輸量是指在客戶端Web瀏覽器和Web服務(wù)器之間傳送的數(shù)據(jù)量。在用VS.NET開發(fā)程序的過程中,通過減少網(wǎng)絡(luò)的通信量減少IE瀏覽器和Web服務(wù)器層之間的數(shù)據(jù)傳數(shù)量,縮短用戶感知時間。

  3.2.1 使用緩存技術(shù)

  合理有效地設(shè)計和使用緩存是優(yōu)化應(yīng)用系統(tǒng)性能的重要手段,在基于Web的支持大量用戶的系統(tǒng)開發(fā)中,這一點(diǎn)尤為明顯。ASP.NET中的緩存能夠提供性能和伸縮性的最大效益、利用有效的緩存、可以避免Web服務(wù)器與數(shù)據(jù)庫之間的網(wǎng)絡(luò)往返,繞過占用很多資源的計算,并節(jié)省服務(wù)器資源,同時改善響應(yīng)時間和等待時間。

  ASP.NET的緩存服務(wù)是一種提高服務(wù)器性能、降低服務(wù)器資源浪費(fèi)的有效方法。對于安全性要求高的應(yīng)用程序,采用在WEB服務(wù)器上維護(hù)緩存數(shù)據(jù)的方式可以有效地提高頁面性能。ASP.NET的緩存對各個應(yīng)用來說是私有的,是存儲各種對象的存儲器,緩存的生存周期取決于應(yīng)用的生存周期,當(dāng)應(yīng)用重新啟動時,緩存實(shí)際上已重建。

  Cache實(shí)現(xiàn)了最近最少使用(least-recently-used)替換算法,允許ASP.NET強(qiáng)制Cache清除操作——如果可用內(nèi)存下降到低水平——則自動從Cache中刪除不使用的項(xiàng)目。另外Cache支持依賴性到期特性,它能強(qiáng)制包括時間、鍵值、文件失效。其體系結(jié)構(gòu)如圖3所示。

  用ASP.NET內(nèi)置的多級緩存功能,緩存訪問過的ASP.NET頁面,從而降低Web服務(wù)器的負(fù)載,并通過更高效地提供被緩存的文件而改善WEB系統(tǒng)的性能。ASP.NET提供了幾個級別的緩存。首先,當(dāng)一個ASPX程序第一次被調(diào)用的時候會被編譯,編譯成功之后,生成的代碼會自動緩存,所以重復(fù)運(yùn)行ASP.NET程序的效率會有很大的提高。除此之外,ASP.NET還提供輸出緩存(也叫頁面緩存)、數(shù)據(jù)緩存(也叫應(yīng)用程序緩存)和碎片緩存(也叫部分頁面緩存)。

  緩存提供一個簡單的字典接口,以便于對象放置到緩存中并在以后使用。最簡單的情況下,放置一個對象到緩存中,就如同對字典增加一個條目。在緩存策略上采用“文件和鍵值依賴”策略。從外部文件或者是其他緩存鍵值是否改變來決定本身鍵值是否有效。如果依賴發(fā)生改變,緩存對象將變得不可使用并從緩存中移動出來,從而更新緩沖。代碼如下:

  3.2.2 避免服務(wù)器和客戶端的交互

  HTTP是用于WWW客戶機(jī)和服務(wù)器之間進(jìn)行信息傳輸?shù)膮f(xié)議,它是一種請求響應(yīng)類型的協(xié)議:客戶機(jī)向服務(wù)器發(fā)送請求,服務(wù)器收到請求后進(jìn)行處理,對這個請求作出回答。Web瀏覽器包含了許多的HTTP請求,每一個請求對應(yīng)一個小型文件,HTTP對每一個HTTP請求需要建立1個獨(dú)立的TCP連接。

  因此,客戶端的每次請求將會引起客戶端和服務(wù)器間的一次通信,頻繁的操作勢必對系統(tǒng)的響應(yīng)時間造成嚴(yán)重的影響。為避免不必要的TCP連接建立,通常只需在向服務(wù)器查詢或更新數(shù)據(jù)時才觸發(fā)客戶端與服務(wù)器之間的信息交互。能在客戶端執(zhí)行的數(shù)據(jù)操作應(yīng)盡可能的用客戶端腳本(如Javascript)實(shí)現(xiàn)。例如,對用戶輸入數(shù)據(jù)的校驗(yàn),應(yīng)該盡量在客戶端進(jìn)行校驗(yàn),再將數(shù)據(jù)提交給服務(wù)器。

  3.2.3 利用DTO減少遠(yuǎn)程調(diào)用次數(shù)

  在分布式架構(gòu)中,相關(guān)層在物理部署上實(shí)現(xiàn)分離,通過網(wǎng)絡(luò)或跨進(jìn)程調(diào)用遠(yuǎn)程對象或服務(wù)。在這種分布式架構(gòu)中,必須先找到遠(yuǎn)程對象位置,而且建立與遠(yuǎn)程計算機(jī)的連接,然后才能將數(shù)據(jù)串行化為字節(jié)流,然后可能進(jìn)行加密,最后才能將其傳輸?shù)竭h(yuǎn)程計算機(jī)。遠(yuǎn)程調(diào)用需要跨越網(wǎng)絡(luò)或進(jìn)程,因此會比較慢。

  避免遠(yuǎn)程調(diào)用中固有的滯后時間問題的最佳方法是進(jìn)行更少的調(diào)用,并讓每個調(diào)用傳遞更多的數(shù)據(jù),這可以通過定義有效的數(shù)據(jù)傳輸對象(Data Transfer Object,DTO)來實(shí)現(xiàn)層與層之間的數(shù)據(jù)傳輸。

  創(chuàng)建一個數(shù)據(jù)傳輸對象(DTO),用該對象包含遠(yuǎn)程調(diào)用所需要的所有數(shù)據(jù)。修改遠(yuǎn)程方法簽名,以便將DTO作為單個參數(shù)接受,并將單個DTO參數(shù)返回給客戶端。在調(diào)用方應(yīng)用程序收到DTO并將其作為本地對象存儲之后,應(yīng)用程序可以分別對DTO發(fā)出一系列單獨(dú)的過程調(diào)用,而不會引發(fā)遠(yuǎn)程調(diào)用開銷。如圖4所示。

  在圖4中,DTO允許遠(yuǎn)程對象在單個遠(yuǎn)程調(diào)用中將整個客戶名稱返回給客戶端,這就將調(diào)用次數(shù)從3次減為1次??蛻舳诉M(jìn)行單個調(diào)用,然后在本地與DTO交互,而不用進(jìn)行多次遠(yuǎn)程訪問服務(wù)器。通過使用DTO,在單一遠(yuǎn)程調(diào)用中傳輸更多的數(shù)據(jù)信息,減少遠(yuǎn)程調(diào)用的次數(shù),提高分布式調(diào)用的性能。

  4 測試結(jié)果及分析

  以上方案已在開發(fā)系統(tǒng)中得到實(shí)際的應(yīng)用,并取得了良好的效果。為了測試以上方案的有效性,這里選取系統(tǒng)中有代表的頁面,利用VS.NET中的ACT(ApplicationCenter Test)工具進(jìn)行壓力測試。在不考慮網(wǎng)絡(luò)傳輸速度的情況下,分別測試原始頁面和改進(jìn)后的頁面,得到表1詳細(xì)的測試結(jié)果:

  從表1中可以看出,采用上述方案生成的頁面無論是在每秒平均請求數(shù)還是平均響應(yīng)時間上,都有數(shù)量級的提高,極大地提高了系統(tǒng)的性能,縮短了Web頁面的響應(yīng)時間,從而縮短用戶感知延遲時間,提高用戶的滿意度。

  5 結(jié) 語

  在B/S結(jié)構(gòu)的開發(fā)中,響應(yīng)時間是一個很重要的指標(biāo)。本文針對Web應(yīng)用程序的特點(diǎn),從軟件處理數(shù)據(jù)的角度出發(fā),從優(yōu)化數(shù)據(jù)訪問以及Web數(shù)據(jù)顯示2方面提出了縮短Web響應(yīng)時間方案,并利用ACT測試工具對實(shí)際應(yīng)用進(jìn)行壓力測試,發(fā)現(xiàn)此方案的可行性。除此之外,還可以通過優(yōu)化數(shù)據(jù)庫結(jié)構(gòu)的設(shè)計,合理配置應(yīng)用服務(wù)器所提供的性能優(yōu)化選擇,合理配置選項(xiàng)等方法對提高Web應(yīng)用的總體性能。



評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉