我们使用 varnish 4 来缓存和处理 ESI。对于返回 5XX 后端错误的 ESI 请求,我们返回一个空的合成响应。
该空响应应该被缓存几秒钟,因为当前对同一 ESI 的每个后续请求都会再次命中后端。每当 5XX 响应的原因是昂贵的原因时,这都会导致我们的后端负载过重。
sub vcl_backend_error {
....
if (isAnESI && beresp.status >= 500 && beresp.status <= 599) {
synthetic({""});
return(deliver);
}
}
我们试图Retry-After
在响应中添加一个标头,但这并不能解决问题。
set beresp.http.Retry-After = "5";