考虑这个场景:
Varnish 缓存有一个 MISS,后端服务器现在正在重新生成请求的内容。在生成期间,第二个请求进入并得到一个 MISS。当另一个请求未决时,varnish 是否将此请求发送到后端?如果这一次之间出现了数千个请求怎么办。服务器会崩溃吧?每一个请求都会让它变慢。

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

先感谢您!

最佳答案

Varnish将所有请求发送到后端。 IE。它不会将其他请求排队,仅发出一个后端请求,然后将其响应用于所有请求。

但是,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部分,以获得更详尽的示例和练习。

固定:不转义
更正了更多问题:还有另一个未转义的

关于varnish - Varnish 在MISS上的行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14580491/

10-13 07:56