我希望能够在Varish4中的重试中更改后端。我们已经使用Varnix3在另一个(旧的)应用程序上工作,但是我还无法为v4找到它,也找不到很多文档。我们想要的设置是有2组控制器--一组用于初始请求,用于在与清漆相同的数据中心中尝试本地服务器,因为这要快得多,然后只有在失败的情况下,才能从其他数据中心中的服务器中随机选择不同的控制器。
在v3中,这很简单:
sub vcl_recv {
if (req.restarts == 0) {
set req.backend = defaultdirector;
} else {
set req.backend = backupdirector;
}
}
#Then in vcl_fetch and/or vcl_error something like:
if (beresp.status >= 500 && req.restarts < some_max) {
return(restart);
}但是现在在v4中,重新启动应该被重试所取代,整个文档如下:
在3.0中,可以在注意到后端响应错误后返回(重新启动),以更改为不同的后端。 这现在被称为返回(重试),并跳回vcl_backend_fetch。 这只影响后端获取线程,客户端处理不受影响.
然而,我仍然看到一些人的示例代码,其中包含返回(重新启动)而不是返回(重试),而且没有一个使用retry命令的示例。
我理解清漆不应该再次在vcl_recv中完成所有的工作(比如剥离cookie),因为只有与后端的通信失败了,所以返回后端获取而不是重做所有前端处理是有意义的,但是如果我试图更改vcl_backend_fetch中的后端,则会出现编译错误。我该怎么做呢?
发布于 2016-04-04 22:06:05
正式文件有点误导人。事实上,重新启动仍然存在:您可以捕获vcl_deliver中的错误,并使用在vcl_recv中相应地设置后端。
sub vcl_recv {
if (req.restarts == 0) {
set req.backend_hint = defaultdirector.backend();
} else {
set req.backend_hint = backupdirector.backend();
}
}
sub vcl_deliver {
if (resp.status >= 500 && req.restarts < some_max) {
return(restart);
}
}或者,如果更合适,可以在vcl_backend_response和vcl_backend_fetch之间使用retry。
sub vcl_backend_fetch {
if (bereq.retries > 0) {
set bereq.backend = backupdirector.backend();
}
}
sub vcl_backend_response {
if (beresp.status >= 500 && bereq.retries < some_max) {
return(retry);
}
}https://stackoverflow.com/questions/35470333
复制相似问题