2015-10-06 53 views
3

我感到困惑在哪里设置在清漆4.宽限时间我见过例如VCL的设置宽限时间vcl_recv清漆4宽限时间取决于后端健康

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设置两个例子。

任何人都可以请解释为什么要设置它在一个特定的地方?

在实践中,我想设置宽限时间取决于后端是否被认为是健康的;凭直觉我把它清漆接触后端以前,所以我设定的宽限时间在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); 
    } 
} 

是这个正确的做法?

回答

4

这是我研究的SOFAR结果:

  1. 设置req.http.gracevcl_recv没有帮助,因为这只是定义了一个新的头项否则清漆会忽略它
  2. 设置obj.gracevcl_hit不起作用与obj仅在清漆4
  3. 的唯一地方的宽限时间可以设定读该漆承认它是在子程序vcl_backend_responseberesp.grace
  4. 因为宽限时间只能在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; 
     ... 
}