varnish-4.x VCL之grace
mode&retry
grace
mode
几点说明:
graced object是己经过期了但仍然保留在cache中的对象
当varnish使用graced object的时候称为grace mode
当后端server不可用时,grace mode仍然可以用graced object来响应客户端的请求
beresp.grace定义的时间为beresp.ttl过期后的仍然可用的时间
grace
mode的主要目标是,当热度非常高的对象过期了,但此时,一直等待后端的新见容无果,这时对于大量的客户端对列仍然用graced
object来响应
示例:
后端HTTP Header
"Cache-control: max-age=60, stale-while-revalidate=30"
或VCL
set req.ttl = 60s;
set beresp.grace = 30s;
• 50s: Normal delivery
• 62s: Normal cache miss, but grace mode possible
• 80s: Normal cache miss, but grace mode possible
• 92s: Normal cache miss, object is removed from cache
<=req.ttl直接返回给客户,beresp.grace清除cache重新向后端server请求
提示: 缓存对象永不过期,可以beresp.grace = 0
测试:
通过apache cgi脚本
cat >/var/www/cgi-bin/test.cgi
<<HERE
#!/bin/sh
sleep 10
echo "Content-type:
text/plain"
echo "Cache-control:
max-age=10, stale-while-revalidate=20"
echo
echo "Hello world"
date
HERE
修改max-age,stale-while-revalidate的值,测试HTTP Header
retry
sub vcl_backend_response {
}
如果retry的次数达到了max_retries, 就会触发 vcl_backend_error.