5

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

这是正确的还是清漆“同步”这些场景以防止出现此类问题?

先感谢您!

4

3 回答 3

2

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

然而,Varnish 有一个宽限选项,可以让您在这些类型的情况下将旧的、过期的内容保存在缓存中。

例如考虑以下 VCL:

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

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

现在,如果后端是健康的(请参阅后端轮询)并且请求导致 a MISS,则第一个请求将发送到后端。如果另一个请求针对相同的内容,但缓存中有一个年龄 <TTL+req.grace 的项目(在本例中为 5 分钟),则该请求将获得“陈旧”的内容。只要导致 a 的第一个请求MISS从后端获得响应(并且缓存再次新鲜)或项目的年龄变得大于 TTL+req.grace,就会发生这种情况。

如果后端关闭(req.backend.healthy == FALSE),那么只要 age<TTL+24h 就会提供过时的内容。

您可能还想查看Varnish 书籍的保存请求部分,以获得更详尽的示例和练习。

固定:未转义的 < 字符。

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

于 2013-01-29T12:20:03.307 回答
0

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

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

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

因此,如果您有一些要缓存的慢速 API 端点,并且它是可缓存的(关于 Varnish 规则),则该 URI 的多个请求将只命中后端一次。

于 2015-03-04T23:29:11.690 回答
0

我对@max_i 的回答没有任何意见或任何意见,所以我提交了另一个答案来验证他的答案。

Ketola 接受的答案并非完全错误,它可能只是过时了,并且对于旧版本的 Varnish 可能是正确的。具体这部分:

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

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

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

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

这样做的缺点当然是第一个请求之后的请求在其后面“排队”,但是与所有 50 个请求同时到达后端(或者在我的测试中是并发的)相比,这当然是一个小问题5)。

于 2018-02-26T08:49:14.310 回答