網路流量瘦身建議
瀏覽器端使用者所感受到的回應時間受很多因素影響,最主要的來的三個方面:
伺服器端的內容產生時間,受伺服器端硬體計算能力和伺服器的應用程式效能影響
網路上傳輸資料的時間,受網路頻寬和所傳輸資料的大小影響
用戶端渲染時間,受用戶端瀏覽器效能和用戶端程式效能影響
伺服器端和用戶端的效能我們在本系列文章的其他部分中有討論。本部分著重討論如何減少網路傳輸時間 。使用者與伺服器的互動不可避免要在網路上傳輸資料。尤其是近年來 WEB2.0 等技術的採用,越來越多的互動 和渲染工作轉移到瀏覽器端進行,顯示一個頁面需要傳輸的資料也越來越多。而這些資料轉送的快慢,要傳輸 資料的大小會在很大程度上影響使用者看到的頁面顯示的速度,也就是我們所關心的用戶端的回應時間。如前所 述,這個時間受網路頻寬和所傳輸資料大小的影響。在既定網路頻寬的條件下,通過對網路上待傳輸資料進行 "瘦身",可以有效提升響應速度。
網路流量不光包含伺服器端與用戶端瀏覽器之間的網路 資料轉送量,如果伺服器端是一個基於網路的多節點環境,各個節點之間的資料也需要在網路上傳輸,這也需 要花時間。圖 1 所示 ( 此簡化圖中忽略了防火牆,Proxy 伺服器,快取服務器等其他因素 ), 在這個簡化的 應用服務模型中,網路傳輸既存在於用戶端瀏覽器和 Web 服務器之間,也存在於 Web 服務器和應用伺服器之 間,以及應用伺服器和資料庫伺服器之間。如果模型更加複雜,則在Proxy 伺服器,快取服務器等和用戶端以及 主伺服器之間也存在網路流量。因此,減少各個節點之間的資料轉送次數和資料轉送量,能夠在很大程度上提 高系統的回應時間和吞吐率,減少效能瓶頸出現的幾率。
要減少網路流量,一般會在幾方面進行處理 :
只傳輸必要的資料。
如果要在用戶端顯示一個頁面,只傳輸當前頁面顯示所需要的資料就足夠了。一些 為滿足將來可能的操作所需要的資料,可以在頁面顯示之後再做延後傳輸,或者未來操作真正發生的時候再做 傳輸。
對要傳輸的資料進行壓縮。
對於不得不傳輸的內容,可以進行壓縮整理後再做傳輸。對於瀏覽器端的客 戶來說,格式整齊可讀性強的代碼對他們沒有意義。但是在不影響頁面效果的情況下,去掉這些 HTML, JSP, javascript, css 等檔案裡格式和注釋資訊卻對減小檔案的大小非常有效。壓縮可以在部署的時候直接往服務 器上放置壓縮整理過的檔案,也可以在編譯或者傳輸的時候做壓縮整理相關的設定。
在可能的情況下盡量將資料緩衝在接近客戶的節點上。
前面我們瞭解到,網路傳輸存在於各層節點之間 。每一層的傳輸都需要花費時間。因此,如果瀏覽器端的請求直接從最靠近的節點上拿取資料,不但能節省網 絡傳輸時間,也能節省各個節點上計算和資料存取的時間。因此應當充分發揮從瀏覽器到資料庫伺服器間各個 層次的緩衝能力,並且儘可能將緩衝放在靠近使用者的層次上。
圖 1. 網路傳輸存在於多個環節
本文將給出一些減少網路資料流量的建議,重點介紹一些減少用戶端瀏覽器和伺服器之間的網路傳輸的建 議。讀者可以酌情應用在自己的 WebSphere Commerce 系統中。(文中給出的配置方式基於 WebSphere Commerce V7 Feature Pack 4。)
1. 減少 JSP 的大小
對於 JSP 頁面,有兩方面的冗餘可以去除。第一類是編譯時間引入的冗餘資訊,第二類是 JSP 代碼中帶有 的格式,空白和注釋資訊等不必要字元。
針對第一類冗餘資訊,可以使用 useCDataTrim 屬性去除。 建議針對 WebSphere Commerce 7.0 以上使用。該屬性可用於減少 WebSphere Commerce 7.0 以上的的 JSP 頁面編譯時間使用 <c:import> 和 <c:param> 標籤所引入的大量空白字元。方法如下:
更 改該路徑下的檔案 $WAS_ROOT/profiles/<profile>/config/cells/<cell>/applications/WC_<profile> .ear/deployments/WC_<profile>/Stores.war/WEB-INF/ibm-web-ext.xml, 添加 useCDataTrim 屬性:
…… <jsp-attribute name="keepgenerated" value="true"/> <jsp-attribute name="trackDependencies" value="true"/> <jsp-attribute name="reloadEnabled" value="true"/> <jsp-attribute name="reloadInterval" value="10"/> <jsp-attribute name="useCDataTrim" value="true"/> <reload-interval value="0"/> ……