考虑这种情况: Varnish缓存有一个MISS,后端服务器现在正在重新生成所请求的内容。在生成时间内,第二个请求进入并获得MISS。当其他请求待处理时,varnish是否将此请求发送到后端?如果在这段时间之间有数千个请求。服务器会崩溃吗?每个请求都会使它变慢。
这是正确的还是清漆“同步”那些情景以防止出现这样的问题?
提前谢谢!
答案 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
,则第一个请求将发送到后端。如果另一个请求来自同一内容,但缓存中有一个项目,其年龄
如果后端已关闭(req.backend.healthy == FALSE),只要年龄 您可能还想查看Saving a request的Varnish 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)。