我們運行一個相對較高容量的內容網站。與大多數內容網站一樣,每個網頁的大部分都是相對靜態的。這些文章很少改變,使它們成爲某種形式的靜態/邊緣緩存的理想選擇。但是,有兩個大問題。輔助頁面元素(導航欄,最近的內容列表等)變化非常頻繁,快速使「完整」緩存頁面失效。我們在頁面中包含更多動態位,比如用戶特定的信息等等也是很常見的。反向代理HTTP請求的後處理? (如Akamai的ESI)
有一個反向代理/負載均衡器可以處理後期內容,讓我們處理包含代理/邊緣。對後端的初始請求會返回一個粗略的模板,然後代理軟件可以處理該模板以完成它。該標記可能是這個樣子:
<html>
<body>
<div id="content">
Lorem ipsum whackem smackem.
<%
dynamic "http://related.content.service/this/story"
%>
</div>
<div id="sidebar">
<%
dynamic do |request|
url = "http://my.user.service/user-widget.html"
if request.cookies.contains?("user_token")
url = "http://my.user.service/" + request.cookies["user_token"] + "/user-widget.html"
end
error_text = "User service not available"
{ :url => url, :timeout => 500, :error => error_text }
end
%>
</div>
</body>
</html>
什麼,你會在這個例子看到的是紅寶石的一個小一點,其基於cookie的值所包含的文件,然後返回一個哈希的URL來拉,一個超時,以及一些默認的文本顯示在一個錯誤的事件。從理論上講,所有的包含都可以異步地被請求。
我的理解是,亞馬遜做了這樣的事情。各種頁面組件由後端服務生成,具有嚴格的超時限制以確保整體頁面速度。我希望他們的CDN服務能夠包含這樣的內容,但不是這樣!
Edge邊包括(ESI)的W3規範幾乎是我想要的。然而,對於它的支持很少。它可以通過Akamai獲得,有一些Oracle軟件可以完成它,開源的Varnish緩存具有非常基本的實現。這也是一個非常醜陋的XML格式。
所以問題是:什麼能讓我做我想做的事?有沒有其他人以這種方式做事?
你能擴充這個答案嗎?這聽起來並不像我想要的那麼多,但可能我錯過了一些東西。 – MrKurt 2008-11-30 20:50:32