ASP.NET效能最佳化之局部緩衝分析

來源:互聯網
上載者:User

在網站的開發過程中,經常碰到的一類需求情境是:

1:頁面含熱點新聞,熱點新聞部分需要10分鐘更新一次,而整個頁面的其它部分1天內都不會變動;

2:首頁的某個BANNER需要顯式:歡迎***;

上面情境中的1,如果整個頁面的緩衝失效都定為10分鐘,則勢必增加效能開銷,所以最好的策略是頁面的不同部分採用不同的緩衝失效時間長度。對於情境2也一樣,我們不應該為了遷就某個BANNER不能應用緩衝,就讓整個頁面都不支援緩衝。

可以說,如果我們在開發網站過程中的緩衝策略是不支援頁面局部緩衝的,整個架構就是不合理的。

一:局部緩衝常用解決方案

針對上面的需求,有幾類解決方案:

1、Client Side Includes(CSI):通過frame、iframe、 javascript、javacript+ajax等方式將另外一個頁面的內容動態包含進來。像現在流行的jquery等javascript庫對此有較好的支援。

優點:能夠利用瀏覽器用戶端平行處理及裝載的機制;通過瀏覽器緩衝機制可以降低網路傳輸時間,提高效能;計算放在用戶端,能夠降低伺服器端壓力

缺點:搜尋引擎最佳化問題;javascript相容性問題;用戶端緩衝可能導致伺服器端內容更新後不能及時生效;XSS等安全隱患

2、Server Side Includes(SSI):

優點:SSI技術是通用技術,不受具體語言限制,只需要Web伺服器或應用伺服器支援即可,Ngnix、Apache、Tomcat、Jboss等對此都有較好的支援

缺點:SSI在文法上不能夠直接包含其他伺服器的url(當然也可以通過redirect等來變通實現),因此在需要充分利用緩衝及負載平衡的環境下相對不是很靈活。

當然如果不使用單獨的快取服務器,而是使用Ngnix,利用Ngnix對SSI及Memcached支援,通過NginxHttpSsiModule、 NginxHttpMemcachedModule也可以實現頁面緩衝,但與專業的快取服務器(例如Varnish)相比較,Ngnix作為快取服務器只適合於中小規模的場合。

3、使用ASP.NET的片段快取

可以利用使用者控制項將頁面分段,在ascx檔案中寫入緩衝的語句,而不在aspx檔案中寫緩衝語句,這樣ASP.NET就可以只緩衝ascx片斷的輸出了。

缺點:片段快取不支援Location特性;快取頁面面片段惟一合法的地方是web伺服器。這是因為片段快取在ASP.NET中是新的功能,所以瀏覽器和Proxy 伺服器不支援。由於它不是W3C標準,像SQUID和VARNISH這樣的Proxy 伺服器也不支援它。

4、Edge Side Includes (ESI):

Edge Side Includes(ESI) 和Server Side Includes(SSI) 和功能類似。SSI需要特殊的檔案尾碼(shtml,inc)。ESI可以直接通過URI包含遠程伺服器檔案,ESI更適合用於快取服務器上,緩衝整個頁面或頁面片段,因此ESI特別適合用於緩衝。本文要介紹的就是ESI的方式來支援局部緩衝。

優點:ESI是一個W3C標準,被當下流行的快取服務器SQUID,Varnish支援。

二:ESI的ASP.NET實現

本文所要闡述的是ESI局部緩衝的實現。首頁面(test1.aspx)前台: 複製代碼 代碼如下:<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="test1.aspx.cs" Inherits="WebApplication2.aspx.test1" %>
<%@ Import Namespace="System.Globalization" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<div>這裡是局部緩衝</div>
<esi:include src="test2.aspx"/>
<div>局部緩衝結束</div>
<%=DateTime.Now.ToString("U", DateTimeFormatInfo.InvariantInfo)%>
</body>
</html>

首頁面的後台請參看上篇,對首頁面採取了緩衝策略,即在頁面中使用esi:include標識。
被包含的頁面(test2.aspx)的前台: 複製代碼 代碼如下:<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="test2.aspx.cs" Inherits="WebApplication2.aspx.test2" %>
<%@ Import Namespace="System.Globalization" %>
<div>
局部緩衝中的頁面:
<%=DateTime.Now.ToString("U", DateTimeFormatInfo.InvariantInfo)%>
</div>

被包含的頁面的後台什麼也不需要處理,也就是不為它加入任何緩衝策略,該頁面是即時的。
VARNISH設定檔如下: 複製代碼 代碼如下:backend default {
.host = "192.168.0.77";
.port = "80";
}
sub vcl_fetch {
remove beresp.http.Set-Cookie;
if(req.url ~ "test1.aspx") {
esi;
}
if(req.url ~ "test2.aspx"){
return (pass);
}
}
sub vcl_recv {
remove req.http.Cookie;
#remove req.http.Accept-Encoding;
#remove req.http.Vary;
}
sub vcl_hit {
if(req.http.Cache-Control~"no-cache"||req.http.Cache-Control~"max-age=0"||req.http.Pragma~"no-cache"){
set obj.ttl=0s;
return (restart);
}
return (deliver);
}
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT";
} else {
set resp.http.X-Cache = "MISS";
}
}

上文的vcl_fetch函數中加了兩個判斷,指的是:如果碰到test1.aspx就處理esi標識,如果碰到test2.aspx,就直接忽略讓後台IIS處理。
值得注意的是,啟動命令中加入了-p選項(這是一個varnish的小問題,請查閱參考,此處不表):
varnishd -a :8011 -T :8088 -f c:/varnish/etc/default.vcl -p esi_syntax=0x1 -s file,c:/varnish/var/cache,100M
三:效果
啟動varnish後,我們發現,對於test2.aspx,由於我們使用了esi對其進行了包含,而test2.aspx又未進行緩衝,所以在test1.aspx的緩衝有效期間內,隨著每一次重新整理,test1.aspx的內容沒有變動,但是所包含的test2.aspx地區,會即時重新整理。
參考(第一小節大部分來自參考文字):
https://www.varnish-cache.org/trac/ticket/352

http://cd34.com/blog/infrastructure/no-esi-processing-first-char-not/

http://hi.baidu.com/chuanliang2007/blog/item/075f67963e20f315d31b7035.html

http://www.w3.org/TR/esi-lang

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.