首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未命中清漆的行为

未命中清漆的行为
EN

Stack Overflow用户
提问于 2013-01-29 18:17:21
回答 3查看 1.7K关注 0票数 5

考虑这样的场景: Varnish缓存未命中,而后端服务器现在正在重新生成请求的内容。在生成期间,第二个请求进入,并且也未命中。当另一个请求挂起时,varnish会将这个请求发送到后端吗?如果在这段时间内有数千个请求,该怎么办?服务器会崩溃,对吧?每一个请求都会使它变慢。

这是正确的,还是varnish“同步”了这些场景以防止此类问题?

提前谢谢你!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-29 20:20:03

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

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

例如,考虑以下VCL:

代码语言:javascript
复制
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),则会像age

您可能还想查看Varnish bookSaving a request部分,以获得更全面的示例和练习。

字符已修复:未转义<

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

票数 2
EN

Stack Overflow用户

发布于 2015-03-05 07:29:12

我相信Ketola(公认的)答案是错误的。

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

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

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

票数 0
EN

Stack Overflow用户

发布于 2018-02-26 16:49:14

我没有要评论@max_i的答案,所以我提交了另一个答案来验证他的答案。

Ketola的公认答案并不是完全错误的,它可能只是过时了,并且可能对旧版本的Varnish是正确的。特别是这一部分:

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

在使用Varish4.1LTS和Apache2.4的标准安装独立测试之后,我创建了一个基本的PHP文件,其中包含以下内容:

代码语言:javascript
复制
<?php sleep(5); echo 'hello world!';

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

这样做的缺点当然是第一个请求之后的请求被“排队”在它后面,但与一次命中后端的所有50个请求(或者在我的测试中,并发为5)相比,这当然是一个次要问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14580491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档