返回一个合成响应,然后在Varnish中获取和缓存对象?

时间:2013-07-15 13:49:39

标签: varnish varnish-vcl

我想知道我的(可能很奇怪的)用例是否可以用VCL在Varnish中实现。我的应用程序依赖于从具有非常低延迟的可缓存API服务器接收响应(如果可能,则为亚毫秒)。应用程序的编写方式是“适当”处理“空”响应(在某些情况下是有效响应),并且API的设计使得非空响应长时间有效(即天)。

所以,我想要做的是配置清漆,以便它:

  1. 尝试查找(并返回)给定API调用的缓存响应
  2. 在缓存未命中时,立即返回“空”响应,并将请求排入后端
  3. 在将来调用#2中的缓存未命中的URL时,返回现在缓存的响应
  4. 是否可以单独使用VCL以这种方式使Varnish行动?如果没有,是否可以编写VMOD来执行此操作(如果是这样,指针,提示等将非常感激!)

1 个答案:

答案 0 :(得分:1)

我认为你不能单独使用VCL,但我认为使用VCL和一些客户端逻辑可以很容易地管理它。

在vcl_miss中,使用错误200返回一个空文档,并在默认情况下设置一个名为X-Try-Again的响应头。 在客户端应用程序中,当使用X-Try-Again设置接收空响应时,异步请求相同的资源,但会向请求添加名为X-Always-Fetch的标头。您的应用程序不会等待响应或一旦到达就对其执行任何操作。 同样在vcl_miss中,检查是否存在相同的X-Always-Fetch标头。如果存在,则返回(获取)而不是空文档。这将从后端请求内容并将其缓存以供将来请求使用。

我还发现这篇文章可能会提供一些帮助,虽然与仅使用客户端代码相比,我的实现有点笨拙:http://lassekarstensen.wordpress.com/2012/10/11/varnish-trick-serve-stale-content-while-refetching/