0

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

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

  1. 尝试查找(并返回)给定 API 调用的缓存响应
  2. 在缓存未命中时,立即返回“空”响应,并将请求排队等待后端
  3. 在将来调用 #2 中缓存未命中的 URL 时,返回现在缓存的响应

是否可以单独使用 VCL 使 Varnish 以这种方式运行?如果没有,是否可以编写一个 VMOD 来执行此操作(如果可以,将不胜感激指针、提示等!)

4

1 回答 1

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 -内容同时重新获取/

于 2013-07-17T18:38:28.330 回答