gpt4 book ai didi

varnish-vcl - 取决于后端健康状况的清漆 4 宽限时间

转载 作者:行者123 更新时间:2023-12-04 02:17:38 24 4
gpt4 key购买 nike

我对在 varnish 4 中设置宽限时间的位置感到困惑。我在 vcl_recv

中看到了 VCL 设置宽限时间的示例
sub vcl_recv {
...
set req.http.grace = 60m;
...
}

其他人在vcl_hit中设置

sub vcl_hit {
...
set obj.grace = 60m;
...
}

在文档 ( https://www.varnish-cache.org/docs/4.0/users-guide/vcl-grace.html ) 中,他们在 vcl_backend_response 中设置了

sub vcl_backend_response {
...
set beresp.grace = 60m;
...
}

我还看到过在 vcl_recvvcl_backend_response 中设置宽限时间的示例。

谁能解释一下为什么要把它放在一个特定的地方?

在实践中,我想根据后端是否健康来设置宽限时间;直觉上我会在 varnish 联系后端之前设置它,所以我会在 vcl_recv 中设置宽限时间并决定是否从 vcl_hit 像这样:

sub vcl_recv {
...
if (std.healthy(req.backend_hint)) {
set req.http.grace = 2m;
} else {
set req.http.grace = 60m;
}
...
}

sub vcl_hit {
if (obj.ttl >= 0s) {
# A standard hit, deliver from cache
return (deliver);
}
elsif (obj.ttl + obj.grace > 0s) {
# page expired, serve from cache in the meantime
return (deliver);
} else {
return (fetch);
}
}

这是正确的做法吗?

最佳答案

这是我目前的研究结果:

  1. vcl_recv 中设置 req.http.grace 没有帮助,因为这只是定义了一个新的头条目,否则清漆将忽略它
  2. vcl_hit 中设置 obj.grace 不起作用,因为 obj 在 varnish 4 中是只读的
  3. 唯一可以设置宽限时间以便 varnish 识别它的地方是 beresp.grace
  4. 中的子例程 vcl_backend_response
  5. 因为宽限时间只能在 vcl_backend_response 中设置,根据后端健康状况设置不同的宽限时间是不可能的,因为只有在缓存未命中后 varnish 从后端获取数据时才会调用此函数,这对我想要的来说已经太迟了。我需要在联系后端之前设置宽限时间。

我根据后端健康状况设置不同宽限期的解决方案是:

  1. 我将宽限时间设置为 2 个宽限时间中的最大值:“正常宽限时间”和“后端出现问题时的宽限时间”
  2. 是从缓存中提供服务还是联系后端在 vcl_hit 中决定;那是我可以效仿第二次宽限期的地方

这是我的 vcl_hit 的样子

sub vcl_hit {
if (obj.ttl >= 0s) {
# A standard hit, deliver from cache
return (deliver);
}
elsif (std.healthy(req.backend_hint)) {
if (obj.ttl + 30m > 0s) {
# page expired within a limited grace time and backend
# is healthy: deliver from cache while cache is updated
# asynchronous
return (deliver);
} else {
# page expired too long ago - fetch from backend
return (fetch);
}
}
else {
if (obj.ttl + obj.grace > 0s) {
# backend is not healthy - provide the page from cache
# during full grace time set in vcl_backend_response
return (deliver);
} else {
# page expired for the full grace time and backend is
# considered unhealthy - try to contact the backend
# anyway
return (fetch);
}
}
}

在这里,我使用条件语句“定义”了 30 分钟的第二个宽限期

            if (obj.ttl + 30m > 0s) {

vcl_backend_response 中,我只是将最大宽限时间设置为 6 小时:

sub vcl_backend_response {
# define full grace time here
set beresp.grace = 6h;
...
}

关于varnish-vcl - 取决于后端健康状况的清漆 4 宽限时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32973862/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com