Однажды заказчик задал простой вопрос: «Если при изменении данных страница и так встаёт в очередь на обновление — зачем обходить сайт по расписанию? Если никто ничего не менял, греть не нужно. Сделайте кэш не на полчаса, а на неделю». Вопрос оказался правильным, и из него выросла модель, которую мы теперь ставим на все сайты.
Это четвёртая часть цикла «Кэш страниц без MISS».
Модель
- Свежесть даёт инвалидация, а не таймер. Изменились данные — затронутые страницы сбрасываются и сразу прогреваются.
fastcgi_cache_valid 200 7d,inactive=7d,max_size=1g.- Суточный обход оставлен как страховка, часовой добор (костыль под короткую валидность) убран, пятиминутная проверка «нет ли холодного» оставлена — она дешёвая.
- Сброс при выкате обязателен: иначе HTML, собранный старыми шаблонами, проживёт неделю.
Как мы к этому пришли: сначала была короткая валидность («посетитель всё равно получает STALE мгновенно, свежесть бесплатна»). Потом замер показал, что каталог товаров к полудню почти весь выпадает из кэша из-за волн обмена с 1С, — добавили часовой обход. Потом посчитали цену (третья часть) — и задали тот самый вопрос.
Честная цена решения
При кэше на 30 минут пропущенный сброс самолечился за полчаса. При кэше на неделю он стоит неделю устаревшего контента. Мы обменяли процессорное время на требование к полноте инвалидации — и это требование нельзя ослаблять.
И это не теория: уже на следующий день после перехода на одном сайте нашлись четыре класса дыр в инвалидации — им посвящена семнадцатая часть цикла.
Как убедиться, что неделя действительно стоит
Срок свежести записан в заголовке каждого файла кэша. Его можно прочитать прямо с диска:
# срок свежести (unix time) из заголовка файла кэша nginx
od -An -tu8 -j8 -N8 /var/cache/nginx/fastcgi/b/8c/<файл>
У свежей копии после перехода — 167 часов запаса. Старые копии живут со старой валидностью до первого обновления: переход происходит сам, по мере обращений и ночного обхода, отдельных действий не нужно.
Выборка 25 адресов на рабочем сайте сразу после правки: HIT 9, STALE 18, MISS 0.
Исключение, которое надо помнить. На одном сайте был отдельный адрес для живых остатков из 1С с кэшем на 30 секунд — так называемый микрокэш. Его неделей заменять нельзя: при переходе меняйте только общее правило для страниц.
Хотите кэш на неделю и без устаревших страниц?
Пришлите адрес — проверю, что у вас сбрасывает кэш при изменениях, и где будут дыры.
// загружаю комментарии…