19 октября 2017

Drupal 8 и Redis, часть 3: очистка внешнего кеша

Алексей Доронин
Руководитель, разработчик, дизайнер

В первой и второй частях мы рассмотрели настройку способа при котором Nginx напрямую сможет читать страницы из Redis, что позволит снизить нагрузку на сервер и фантастически увеличит скорость работы сайта. В этой статье речь пойдёт об очистке Redis Page Cache. На самом деле, метод, которым мы будем пользоваться для очистка нашего кеша страниц в Redis, практически не отличается от стандартных методов очистки внешних кешей, навроде кеша Varnish или CDN.

  1. Drupal 8 и Redis, часть 1: отдельный кеш в Redis
  2. Drupal 8 и Redis, часть 2: обзор модуля и настройка NGINX
  3. Drupal 8 и Redis, часть 3: очистка внешнего кеша

Итак, у нас настроен NGINX, установлен и работает наш экспериментальный модуль Redis Page Cache, который сохраняет plain-версии страниц сайта в Redis.

Для очистки кеша нам понадобятся следующие модули Drupal:

Включаем все модули, не забываем про Purge UI.

Суть метода

У нас есть «наш» кеш страниц в Redis, мы его назвали Redis Page Cache. Как говорилось в предыдущих статьях, это по своей сути внешний кеш. Его очистку можно сделать также, как делают другие  — на основе http-запросов в которых указываются параметры для очистки (или инвалидации).

Для этого используем модуль Generic HTTP Purger. Он отправляет на внешний сервис http-запросы с информацией какие данные в кеше нужно сбросить.

Но у записей из Redis Page Cache нет никакой информации о времени истечения кеша, нет тегов. Каким образом можно отслеживать изменения и отправлять запросы на очистку нужных страниц?

Ответ — модуль URLs queuer. Этот модуль создаёт таблицу с соответствиями URL и кеш-тегов Drupal. На основе этих соответствий, модуль формирует очередь на очистку. Другими словами, это посредник связующий кеш-теги Drupal и адреса страниц.

The module trains its traffic registry by collecting URLs from requests that miss cache inside Drupal's own page cache. These URLs are stored along with their associated cache tags inside this same traffic registry. Now when Drupal invalidates a set of tags because someone edited a page, these tags are used to fetch URLs from the registry and are added to the Purge queue.

Как раз то, что нам необходимо.

Настройка Generic HTTP Purger

Заходим в настройки Purge: /admin/config/development/performance/purge 

Нажимаем Add purger, выбираем HTTP Purger:

И задаём настройки:

1. Name: название пурджера может быть любым. 

2. Type: Url

3. Hostname: домен вашего проекта

4. Port: порт

5. Path: /rpcache/rpcache-clear

6. Request Method: POST

7. Scheme: протокол

Далее понадобится вторая вкладка Headers:

В ней нужно указать заголовки и их значения, как на картинке.

X-RPCache-Type — [invalidation:type]
X-RPCache-Url — [invalidation:expression]

В итоге мы сделали пурджер, который будет отправлять POST запросы по адресу http://yourdomain.com/rpcache/rpcache-clear, в заголовках этих запросов будет содержаться информация какой URL нужно удалить из кеша.

Как можно догадаться, в нашем модуле Redis Page Cache есть endpoint по адресу /rpcache/rpcache-clear, который принимает эти запросы и очищает нужные страницы из Redis.

Настройка URLs queuer

Очень важна правильная настройка этого модуля, если в других модулях  «или работает или не работает», то некорректная настройка этого модуля приведёт к проблемам в работе внешнего кеша в Redis, а точнее, к проблемам с очисткой кеша.

Крайне желательно внимательно прочитать всё описание модуля URLs queuer.

На странице /admin/config/development/performance/purge, во вкладке QUEUE есть настройки:

Важно, чтобы эти настройки соответствовали настройкам Redis Page Cache /admin/config/development/rpcache

В частности, проверяем и редактируем список URL, которые не должны обрабатываться модулем URLs queuer. Эти страницы не будут попадать в систему учёта (traffic registry) для отслеживания кеширования. 

Эти же самые страницы должны быть отмечены, как исключённые в настройках кеша /admin/config/development/rpcache, иначе не будет работать механизм их очистки.

Очистка кеша

По мере обновления кеша Drupal, в очереди на очистку появляются элементы /admin/config/development/performance/purge:

Очистить внешний кеш можно командой drush p-queue-work, она отображается в этой же колонке вверху. Запустится пурджер, то есть обработчик, который мы настроили выше, и отправит команды на очистку внешнего кеша.

Как это работает: например, мы отредактировали какую-то страницу, Drupal автоматически сбросил свой кеш для этой страницы, модуль URLs queuer сопоставил теги и адрес страницы, добавил её в очередь на очистку внешнего кеша.  

В заключении, небольшое сравнение описанного механизма с Varnish:

 Redis Page CacheVarnish
Простота конфигурации+/-
Нужен динамический модуль для Nginx, несколько модулей Drupal
+/-
Настройка самого Varnish, дополнительный софт и настройки для SSL
Скорость +-
Очистка кеша+/-
Через Purge. Поддержка тегов. Минус — зависимость от модуля URLs queuer и его ограничений
+
Через Purge. Поддержка тегов.
Простота отладки+-
Стабильность-
Эксперимент
+