Лучшие практики кэширования страницы результатов поиска по страницам блога с использованием Varnish

Вопрос или проблема

Как следует кэшировать страницу результатов поиска блога, учитывая, что она возвращает список из 10 элементов с постраничной навигацией (GET ?query=<поисковый_термин>&page=<номер>) для перехода на следующую страницу? Какие заголовки управления кэшированием должен отправлять бэкенд в Varnish и какие лучшие практики по управлению кэшем в этом сценарии? Есть ли рекомендации по эффективной обработке кэширования с постраничной навигацией в Varnish?

Есть 2 аспекта, которые следует рассмотреть исходя из вашего вопроса:

  1. Как долго кэшировать такой результат поиска
  2. Как определить результаты поиска в кэше (и обеспечить хорошую частоту попадания)

Cache-Control

Заголовок Cache-Control, который вам нужен, зависит от ряда факторов, но давайте предположим, что у вас есть механизм инвалидизации кэша, встроенный в ваш код, который может удалять устаревшие объекты из кэша.

В этом случае вы можете установить более длительные TTL. Вы также можете установить разные TTL для Varnish и для браузера.

Вот пример:

Cache-Control: public, max-age=600, s-maxage=3600, stale-while-revalidate=86400

Этот заголовок будет инструктировать Varnish кэшировать объект на час (s-maxage=3600) и предоставляет браузеру возможность кэшировать в течение 600 секунд (max-age=600).

После часа объект станет недействительным, но из-за stale-while-revalidate=86400 объект будет храниться в кэше еще один день (максимум) после истечения срока действия объекта, чтобы обслуживать устаревший контент во время асинхронной повторной проверки.

Это означает, что старый контент возвращается намеренно для обеспечения достойной производительности, в то время как более новая версия этого контента загружается с бэкенда.

Эти значения TTL на самом деле не являются лучшими практиками, но они предоставляют вам возможность кэшировать достаточно долго. И это нормально, потому что мы предполагаем, что можем очищать элементы из кэша при изменениях в системой бэкенда.

Улучшение частоты попадания

Второй вопрос связан с идентификацией объектов в кэше.

По умолчанию Varnish использует полный URL для идентификации объектов в кэше. Параметры строки запроса также учитываются. Вы используете их для отображения результатов поиска.

Именно поэтому важно очищать их, чтобы обеспечить хорошую частоту попадания.

Одним из советов является проверка определенных значений в VCL перед попаданием в кэш. Быстрый пример:

if(req.url ~ "\?query=[^&]+&page=.*$" && req.url !~ "&page=[^0-9]+") {
    return(synth(400));
}

Этот быстрый и грязный код обеспечит, что значение параметра page является числовым, и вернет синтетический HTTP 400 ответ, если это не так.

Вы также можете проверить значение параметра query и фильтровать несуществующие поисковые термины.

Я бы также применил функцию regsuball() к URL, чтобы удалить ненужные параметры строки запроса, которые пользователи могут добавить. Это приведет к сбоям в кэше и позволит злоумышленникам отравить кэш.

Эта техника также может быть использована для удаления маркетинговых параметров (Google, Hubspot и других), как объясняется в одном из наших учебников.

Наконец, я бы рекомендовал сортировать параметры строки запроса в алфавитном порядке, чтобы улучшить вашу частоту попадания и избежать нежелательных вариантов кэша. Это также объясняется в том учебнике. Это основано на set req.url = std.querysort(req.url);.

Ответ или решение

Лучшие практики кэширования страниц поиска блога с пагинацией в Varnish

При создании кэшированной страницы результатов поиска блога с пагинацией, важно учитывать несколько ключевых аспектов для достижения оптимальной производительности и обеспечения эффективного управления кэшем. Данная статья предлагает рекомендации по кэшированию страниц результатов поиска с использованием Varnish, включая соответствующие заголовки управления кэшем и методы улучшения показателей попадания в кэш.

1. Заголовки кэширования

Правильная настройка заголовков Cache-Control имеет критическое значение для кэширования страниц поиска. Исходя из предположения, что в вашей системе имеется механизм инвалидирования кэша, который автоматически удаляет устаревшие объекты, вы можете использовать более длительные TTL (время жизни объектов в кэше). Для настройки заголовков можно использовать следующий пример:

Cache-Control: public, max-age=600, s-maxage=3600, stale-while-revalidate=86400
  • public указывает, что ресурс может кэшироваться любым кэшем (броузером или прокси).
  • max-age=600 позволяет браузеру кэшировать ответ на 10 минут.
  • s-maxage=3600 указывает Varnish кэшировать ответ на 1 час.
  • stale-while-revalidate=86400 позволит Varnish продолжать возвращать устаревшую версию контента в течение 24 часов, пока происходит асинхронное обновление.

Этот подход гарантирует, что даже при устаревшем контенте производительность остается на высоком уровне, так как пользователи получают устаревшие, но все же актуальные данные, в то время как новая версия загружается в фоновом режиме.

2. Улучшение показателей попадания в кэш

Вторым важным аспектом является идентификация результатов поиска в кэше для максимизации числа кэшированных объектов. По умолчанию Varnish использует полный URL для идентификации объектов в кэше, что включает параметры запроса. Для повышения показателей попадания в кэш важно управлять и фильтровать эти параметры.

Проверка параметров запроса

Рекомендуется проверить значение параметров в конфигурации VCL, прежде чем объекты будут помещены в кэш. Например, можно использовать следующий код для валидации параметра page:

if (req.url ~ "\?query=[^&]+&page=.*$" && req.url !~ "&page=[^0-9]+") {
    return (synth(400));
}

Эта проверка возвращает HTTP 400, если параметр page не является числом, что предотвращает некорректные запросы.

Удаление ненужных параметров

Использование функции regsuball() позволит удалить ненужные параметры из URL. Это особенно важно для исключения параметров, которые могут ухудшить показатели попадания в кэш или злоупотребить кэшем.

Кроме того, сортировка параметров запроса в алфавитном порядке также улучшает показатели попадания в кэш. Для этого можно использовать следующую строку:

set req.url = std.querysort(req.url);

Это исключит нежелательные вариации кэша и повысит стабильность запросов.

Рекомендации по кэшированию с пагинацией

С учетом особенностей пагинации особое внимание необходимо уделить кешированию страниц с разными значениями параметра page. Рассмотрите возможность предустановленной кэширования для каждой страницы, избегая ожидания повторных запросов при навигации по страницам.

Использование X-Cache заголовка

Обеспечьте наличие заголовка X-Cache, который будет информировать о том, было ли содержимое загружено из кэша или получено с сервера. Это поможет в будущем оптимизировать поведение кэша и его механизмы.

Заключение

Кэширование страниц результатов поиска с пагинацией в Varnish требует тщательного подхода к настройке заголовков и механизма управления кэшем. Используйте предложенные рекомендации для достижения высоких показателей производительности и эффективности кэширования, минимизируя время отклика для конечного пользователя и улучшая его общий опыт. С правильно настроенным кэшированием можно значительно снизить нагрузку на сервер и обеспечить стабильное отображение контента для пользователей.

Оцените материал
Добавить комментарий

Капча загружается...