При использовании встроенного в VCL (см код, приведенную ниже):
# Built-in 'vcl_hit'.
sub vcl_hit {
if (obj.ttl >= 0s) {
return (deliver);
}
if (obj.ttl + obj.grace > 0s) {
return (deliver);
}
return (fetch);
}
Если vcl_backend_error
достигается фоновым/асинхронный бэкендов, вызванных return (deliver)
во время vcl_hit
вам не нужно беспокоиться. Это просто фоновый поток для обновления застопоренного объекта. Задержанный контент уже доставлен клиенту.
Если vcl_backend_error
достигается за счет синхронного бэкэнда, вызванного return (fetch)
во время vcl_hit
, вам также не нужно беспокоиться. Ошибка будет доставлена клиенту, но у вас нет выбора. Замкнутый объект недоступен в лакокрасочном хранилище.
Однако, если вы настроили vcl_hit
ограничить благодать, когда бэкенд здоров (см VCL примера код ниже), return (fetch)
выполняется во время vcl_hit
будет обрабатываться как запрос синхронного бэкэнда. Клиент будет ожидать ответ на бэкэнд. Если запрос бэкэнд достигает vcl_backend_error
, и ошибка будет доставлена на клиентскую сторону. Замкнутый объект доступен в хранилище Varnish (остановился более 60 секунд назад в этом примере), но он не будет использоваться.
# Customised 'vcl_hit'.
sub vcl_hit {
if (obj.ttl >= 0s) {
return (deliver);
}
if (std.healthy(req.backend_hint)) {
if (obj.ttl + 60s > 0s) {
return (deliver);
}
} else {
if (obj.ttl + obj.grace > 0s) {
return (deliver);
}
}
return (fetch);
}
Если вы хотите поставить приостановленные объекты, когда синхронный бэкенд выборки не удается, в этом случае вам нужна дополнительная логика VCL. Идея приведена в коде ниже:
backend fail_be {
.host = "127.0.0.1";
.port = "9000";
.probe = {
.url = "/give-me-a-non-200-please";
.interval = 24h;
.timeout = 1s;
.window = 1;
.threshold = 1;
}
}
sub vcl_recv {
# Force the non-healthy backend in case of restart because of a previous
# failed backend fetch. This will force serving stalled content using
# full grace during 'vcl_hit' (if possible).
if (req.restarts == 0) {
unset req.http.X-Varnish-Restarted-5xx;
} else {
if (req.http.X-Varnish-Restarted-5xx) {
set req.backend_hint = fail_be;
}
}
# ...
}
sub vcl_synth {
# 503 generated for synchronous client requests when abandoning the
# backend request (see 'vcl_backend_fetch') and not executing a POST.
if (resp.status == 503 &&
req.method != "POST" &&
!req.http.X-Varnish-Restarted-5xx) {
set req.http.X-Varnish-Restarted-5xx = "1";
return (restart);
}
# ...
}
sub vcl_backend_fetch {
if (bereq.retries == 0) {
unset bereq.http.X-Varnish-Backend-5xx;
} else {
if (bereq.http.X-Varnish-Backend-5xx) {
# Jump to 'vcl_synth' with a 503 status code.
return (abandon);
}
}
# ...
}
sub vcl_backend_response {
if (beresp.status >= 500 && beresp.status < 600) {
set bereq.http.X-Varnish-Backend-5xx = "1";
return (retry);
}
# ...
}
sub vcl_backend_error {
set bereq.http.X-Varnish-Backend-5xx = "1";
return (retry);
}
Я не совсем понимаю ваш вопрос. Насколько я понимаю в Varnish 4, когда новый запрос прибывает после времени жизни кэшированного объекта, но в течение льготного времени Varnish доставит устаревший объект и создаст асинхронный запрос на бэкэнд. Если этот запрос не выполнен, устаревший объект все равно будет доставлен до конца времени извлечения. – Ronald