我们经营着一个内容量相对较大的网站。像大多数内容网站一样,每个页面的大部分内容都是相对静态的。这些文章很少改变,使它们成为某种形式的静态/边缘缓存的良好候选者。但是,有两个大问题。二级页面元素(导航、最近的内容列表等)变化非常频繁,很快就会使“完整”缓存页面失效。我们在页面中包含更多动态位(例如用户特定信息等)也很常见。
拥有一个反向代理/负载均衡器来对内容进行后处理并让我们在代理/边缘处理包含内容会非常好。对后端的初始请求将返回一个粗略的模板,然后代理软件可以处理该模板以完成它。标记可能看起来像这样:
<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>
您将在该示例中看到一小部分 Ruby,它根据 cookie 值确定包含的文件,然后返回带有要拉入的 URL、超时和一些默认文本的哈希值,以在出现异常时显示错误。理论上,所有包含也可以异步请求。
我的理解是亚马逊会做这样的事情。各种页面组件由后端服务生成,具有严格的超时限制以确保整体页面速度。我希望他们的 CDN 服务会包含这样的内容,但事实并非如此!
Edge Side Includes (ESI) 的 W3 规范几乎是我想要的。然而,对它的支持很少。它可以通过 Akamai 获得,有一些 Oracle 软件可以做到这一点,开源 Varnish 缓存有一个非常基本的实现。它也是一种非常丑陋的 XML 格式。
所以问题是:有什么可以让我做我想做的事?还有其他人以这种方式做事吗?