Varnish VCL: как включить req.backend_hint?

У меня есть следующий VCL:

vcl 4.0;

import std;
import directors;

backend one {
    .host = "localhost";
    .port = "3333";
}

backend two {
    .host = "localhost";
    .port = "3333";
}

sub vcl_init {
    new random_director = directors.random();
    random_director.add_backend(two, 10);
    random_director.add_backend(one, 8);
}

sub vcl_recv {

    std.log("start vcl_recv");

    set req.backend_hint = random_director.backend();
    if (req.backend_hint == one) {
        std.log("one");
    } else if (req.backend_hint == two) {
        std.log("two");
    } else {
        std.log("neither one");
    }

    std.log("end vcl_recv");
}

Когда я запускаю его, вывод всегда:

start vl_recv
neither one
end vcl_recv

Как я могу правильно проверить, какой бэкэнд был выбран?

Спасибо


person jononomo    schedule 11.04.2017    source источник
comment
Что произойдет, если вы просто std.log(req.backend_hint) сразу после установки?   -  person    schedule 14.04.2017


Ответы (2)


В vcl_backend_fetch вы должны иметь доступ к bereq.backend.name

Итак, перемещая ваш код, вы можете получить что-то вроде:

sub vcl_backend_fetch {
    if (bereq.backend.name == "one") {
       std.log("one");
    } else if (bereq.backend.name == "two") {
       std.log("two");
    } else {
       std.log("neither one");
    }
}
person Joshua DeWald    schedule 21.04.2017

Обновление: невозможно узнать выбранный сервер до запроса вызова сервера, поэтому вы никогда не получите эту информацию в файле vcl_recv. Поскольку вам может не понадобиться выбор бэкэнда (если объект уже находится в кеше) или потому что бэкэнд может измениться (если он выйдет из строя) до того, как будет запущен выбор (то есть время между vcl_recv и vcl_fetch_response), это будет пустая трата ресурсов, чтобы определить его в vcl_recv.

Но в Varnish 5.0+ вы можете использовать beresp.backend (или beresp.backend.name, поскольку вам нужно регистрировать его как строку), доступный в vcl_backend_response, который определяется как:

Это бэкэнд, из которого мы взяли. Если для bereq.backend был установлен директор, это будет серверная часть, выбранная директором.

См.: https://varnish-cache.org/docs/5.0/reference/vcl.html#beresp

person Yvan    schedule 10.04.2018