Режим благодати и удержание
Иногда вы хотите, чтобы Varnish предоставлял контент, который несколько устарел, вместо того, чтобы ждать свежий объект от бэкенда. Например, если у вас новостной сайт, предоставление главной страницы, которая немного устарела на несколько секунд, не является проблемой, если это даёт вашему сайту более быстрое время загрузки.
В Varnish это достигается с помощью grace mode. Похожая идея — keep, которая также объясняется здесь.
Режим благодати
Когда несколько клиентов запрашивают одну и ту же страницу, Varnish отправит один запрос на бэкенд и поместит остальные в очередь, пока извлекается одна копия из бэкенда. В некоторых продуктах это называется объединением запросов, и Varnish делает это автоматически.
Если вы обслуживаете тысячи хитов в секунду, очередь ожидающих запросов может стать очень большой. Существуют две потенциальные проблемы — одна — проблема «грозового стада» — внезапное освобождение тысячи потоков для обслуживания контента может резко увеличить нагрузку. Во-вторых — никто не любит ждать.
Установка grace объекта в положительное значение сообщает Varnish, что он должен предоставлять объект клиентам некоторое время после истечения срока действия, в то время как Varnish извлекает новую версию объекта. Значение по умолчанию контролируется параметром выполнения default_grace.
Удержание
Установка keep объекта сообщает Varnish, что он должен сохранить объект в кэше на некоторое дополнительное время. Причины для установки keep — использование объекта для построения условного запроса GET на бэкенд (с заголовками If-Modified-Since: и/или If-None-Match:), позволяя бэкенду отвечать с кодом 304 Not Modified, что может быть более эффективным на бэкенде и экономит пересылку неизменённого тела.
Значения являются аддитивными, поэтому, если благодать составляет 10 секунд, а удержание — 1 минуту, объекты будут сохраняться в кэше 70 секунд после истечения срока действия.
Настройка благодати и удержания
Мы можем использовать VCL, чтобы заставить Varnish хранить все объекты в течение 10 минут после истечения срока действия с периодом благодати 2 минуты:
sub vcl_backend_response {
set beresp.grace = 2m;
set beresp.keep = 8m;
}
Эффект благодати и удержания
Для большинства пользователей достаточно установить значение благодати по умолчанию или подходящее значение благодати для каждого объекта. VCL по умолчанию будет выполнять правильные действия и вести себя, как описано выше. Однако, если вы хотите настроить поведение Varnish, вам необходимо знать некоторые детали его работы.
Когда sub vcl_recv заканчивается на return (lookup) (что является стандартным поведением), Varnish будет искать соответствующий объект в своём кэше. Затем, если он нашёл только объект, срок действия которого истек, Varnish рассмотрит следующее:
- Есть ли уже текущий запрос бэкенда на этот объект?
- Находится ли объект в
grace period?
Затем Varnish реагирует, используя следующие правила:
- Если срок действия
grace periodистек, и нет текущего запроса бэкенда, тоsub vcl_missвызывается немедленно, и объект будет использоваться в качестве кандидата для 304. - Если срок действия
grace periodистек, и есть текущий запрос бэкенда, то запрос будет ждать завершения запроса бэкенда. - Если нет запроса бэкенда на объект, он планируется.
- Предполагая, что объект будет доставлен,
sub vcl_hitвызывается немедленно.
Обратите внимание, что извлечение из бэкенда происходит асинхронно, и в момент, когда новый объект будет доступен, он заменит уже имеющийся.
Если вы не определите свой sub vcl_hit, будет использоваться значение по умолчанию. Оно выглядит следующим образом:
sub vcl_hit {
return (deliver);
}
Обратите внимание, что условие obj.ttl + obj.grace > 0s (в sub
vcl_hit) всегда будет истинным. В более ранних версиях (6.0.0 и более ранние) это не так, и для проверки в встроенном VCL необходимо было убедиться, что «объекты удержания» (объекты в кэше, где истекли как срок действия, так и благодать) не будут переданы клиентам.
В текущей версии, когда доступны только «объекты удержания», будет вызван sub vcl_miss, и будет инициировано извлечение нового объекта.
Некорректно работающие серверы
Ключевой функцией Varnish является его способность защитить вас от некорректно работающих веб- и приложений серверов.
Если вы включили проверки состояния, вы можете проверить, является ли бэкенд неисправным, и изменить поведение при работе с благодатью. Это можно сделать следующим образом:
sub vcl_backend_response {
set beresp.grace = 24h;
// no keep - the grace should be enough for 304 candidates
}
sub vcl_recv {
if (std.healthy(req.backend_hint)) {
// change the behavior for healthy backends: Cap grace to 10s
set req.grace = 10s;
}
}
В примере выше устанавливается специальная переменная req.grace. Эффект состоит в том, что, когда бэкенд работает корректно, объекты с благодатью свыше 10 секунд будут иметь effective благодать 10 секунд. Когда бэкенд неисправен, срабатывает VCL по умолчанию, и используется большая благодать.
Кроме того, вы можете остановить вставку в кэш, когда запрос на бэкенд возвращает ошибку 5xx:
sub vcl_backend_response {
if (beresp.status >= 500 && bereq.is_bgfetch) {
return (abandon);
}
}
Резюме
Режим благодати позволяет Varnish предоставлять клиентам слегка устаревший контент, в то же время получая свежую версию от бэкенда. Результатом является более быстрое время загрузки при меньших затратах.
Можно ограничить благодать во время поиска, установив req.grace, а затем изменить поведение при работе с благодатью. Часто это делается для изменения effective благодати в зависимости от состояния бэкенда.
Copyright © 2006 Verdens Gang AS
Copyright © 2006–2020 Varnish Software AS
Licensed under the BSD-2-Clause License.
https://varnish-cache.org/docs/7.4/users-guide/vcl-grace.html