清漆在MISS上的行为

时间:2013-01-29 10:17:21

标签: varnish

考虑这种情况: Varnish缓存有一个MISS,后端服务器现在正在重新生成所请求的内容。在生成时间内,第二个请求进入并获得MISS。当其他请求待处理时,varnish是否将此请求发送到后端?如果在这段时间之间有数千个请求。服务器会崩溃吗?每个请求都会使它变慢。

这是正确的还是清漆“同步”那些情景以防止出现这样的问题?

提前谢谢!

3 个答案:

答案 0 :(得分:2)

Varnish将所有请求发送到后端。即它不会对其他请求进行排队,只发出一个后端请求,并对所有请求使用其响应。

然而,Varnish有一个grace option,可以让您在缓存中保留旧的过期内容,以应对这些类型的情况。

例如,请考虑以下VCL:

sub vcl_recv {
  if (req.backend.healthy) {
    set req.grace = 5m;
  } else {
    set req.grace = 24h;
  }
}

sub vcl_fetch {
   set beresp.grace = 24h;
}

现在,如果后端运行正常(请参阅backend polling)并且请求结果为MISS,则第一个请求将发送到后端。如果另一个请求来自同一内容,但缓存中有一个项目,其年龄MISS的第一个请求从后端获得响应(并且缓存再次刷新)或者项目的年龄变得大于TTL + req.grace,就会发生这种情况。

如果后端已关闭(req.backend.healthy == FALSE),只要年龄

您可能还想查看Saving a requestVarnish book部分,以获取更全面的示例和练习。

修正:未转义<字符。

修正了更多:还有另一个未转义的<字符...

答案 1 :(得分:0)

我相信Ketola(接受)的回答是错误的。

对同一URI 的多个Varnish请求将排队。

那么它取决于第一个请求的结果是否可以缓存。如果是,它也将用于其他(排队)请求。 如果没有,所有其他排队的请求将被发送到后端。

因此,如果您想要缓存一些缓慢的API端点,并且它可以缓存(关于清漆规则),那么多个请求只会针对该URI命中一次后端。

答案 2 :(得分:0)

我没有对@ max_i的回答发表评论或其他任何评论,所以我提交了另一个答案来验证他。

Ketola接受的答案并非完全错误,它可能只是过时了,对于旧版本的Varnish可能也是如此。特别是这部分:

  

Varnish将所有请求发送到后端。即它不会对其他请求进行排队,只发出一个后端请求,并对所有请求使用其响应。

使用标准安装的Varnish 4.1 LTS和Apache 2.4自行独立测试后,我创建了一个基本的PHP文件,其中包含以下内容:

<?php sleep(5); echo 'hello world!';

然后使用ab使用5个并发的50个请求来测试HTTP请求周期。结果表明,虽然Varnish接受了每一个连接,但只有一个请求被发送到后端,正如预期的那样,大约需要5秒才能解决。每个Varnish连接随后必须等待最短时间才能收到回复。

这样做的缺点当然是第一个请求后排队等待#34;在它背后,但这当然是一个小问题,相比之下,所有50个请求一次到达后端(或者在我的测试中,并发度为5)。