考虑这样的场景: Varnish缓存未命中,而后端服务器现在正在重新生成请求的内容。在生成期间,第二个请求进入,并且也未命中。当另一个请求挂起时,varnish会将这个请求发送到后端吗?如果在这段时间内有数千个请求,该怎么办?服务器会崩溃,对吧?每一个请求都会使它变慢。
这是正确的,还是varnish“同步”了这些场景以防止此类问题?
提前谢谢你!
发布于 2013-01-29 20:20:03
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),则会像age
您可能还想查看Varnish book的Saving a request部分,以获得更全面的示例和练习。
字符已修复:未转义<。
修复了更多:有另一个未转义的<字符...
发布于 2015-03-05 07:29:12
我相信Ketola(公认的)答案是错误的。
对同一URI 的Varnish的多个请求将被排队。
然后,它取决于第一个请求的结果是否可缓存。如果是,它也将用于其他(排队的)请求。如果不是,则所有其他排队的请求都将发送到后端。
因此,如果您有一些想要缓存的慢速API端点,并且它是可缓存的(关于Varnish规则),那么对于该URI,多个请求将仅命中后端一次。
发布于 2018-02-26 16:49:14
我没有要评论@max_i的答案,所以我提交了另一个答案来验证他的答案。
Ketola的公认答案并不是完全错误的,它可能只是过时了,并且可能对旧版本的Varnish是正确的。特别是这一部分:
Varnish会将所有请求发送到后端。即,它不对其他请求进行排队,并且仅发出一个后端请求,并对所有请求使用其响应。
在使用Varish4.1LTS和Apache2.4的标准安装独立测试之后,我创建了一个基本的PHP文件,其中包含以下内容:
<?php sleep(5); echo 'hello world!';然后使用ab在5个并发的情况下使用50个请求测试HTTP请求周期。结果显示,虽然Varnish接受每个单独的连接,但只有一个请求被发送到后端,正如预期的那样,大约需要5秒才能解决。随后,每个Varnish连接都必须等待该最短时间段才能收到响应。
这样做的缺点当然是第一个请求之后的请求被“排队”在它后面,但与一次命中后端的所有50个请求(或者在我的测试中,并发为5)相比,这当然是一个次要问题。
https://stackoverflow.com/questions/14580491
复制相似问题