在清漆 4 中重试期间更改后端



我希望能够在 Varnish 4 中重试时更改后端。我们已经使用 Varnish 3 在不同的(旧(应用程序上工作,但我无法弄清楚 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。

这仅影响后端提取线程,客户端处理不受影响。

然而,我仍然看到一些人的示例代码包含 return(restart( 而不是 return(retry(,并且没有一个它与 retry 命令一起使用的示例。

我知道清漆不应该再次完成vcl_recv中的所有工作(例如剥离cookie(,因为只有与后端的通信失败,因此反弹回后端获取而不是重做所有前端处理确实有意义,但是如果我尝试在vcl_backend_fetch中更改后端,则会出现编译错误。我该如何完成这项工作?

官方文档有点误导。事实上,重启仍然存在:您可以使用req.backend_hintvcl_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_responsevcl_backend_fetch之间使用重试

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);
    }
}

最新更新