Spec-Zone.ru › Varnish

Режим благодати и удержание

Иногда вы хотите, чтобы 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API