У кэша сайта обычно одна цель — «чтобы было быстро». Её невозможно проверить: быстро для кого, когда, на какой странице? Мы сформулировали цель иначе, и от этой формулировки потом выросли все решения, о которых пойдёт речь в цикле.

Что бы ни сбросило кэш — правка в админке, выкат, обмен с 1С, генератор миниатюр, — система сама подхватывает устаревшее и ставит в обновление. Посетитель в худшем случае получает STALE, но никогда — MISS.

цель, как её сформулировал заказчик

Это первая часть цикла «Кэш страниц без MISS».

Три статуса и что они значат

СтатусЧто произошлоКак к этому относиться
HITстраница отдана из кэша, она свежаяхорошо, но не самоцель
STALEотдана устаревшая копия мгновенно, обновление идёт фономнорма: посетитель ничего не ждёт
MISSкопии нет, страница собирается при посетителеотказ: человек ждёт полный рендер — секунды

Отсюда главный сдвиг: мерить нужно MISS, а не HIT. На сайте с живым обменом данных HIT в 100 % не бывает никогда — что-то всегда обновляется. А вот MISS можно свести к нулю. Единственный допустимый MISS — у страницы, созданной секунды назад.

Три слоя кэша

  1. Страницы. Готовый HTML в кэше nginx (fastcgi_cache). Отдаётся за десятки миллисекунд без участия PHP.
  2. Фрагменты. Блоки, которые страница догружает отдельным запросом (ajax). nginx их не кэширует — им нужен свой кэш; о нём отдельный цикл.
  3. Перечень того, что должно быть в кэше. Про этот слой забывают чаще всего, а без него гарантия невозможна: нельзя гарантировать, что всё в кэше, если неизвестно, что такое «всё».

Чем это закончилось на живом сайте

На каталоге среднего размера с обменом 1С кэш был, но держался «как повезёт»: из семи компонентов, без которых гарантия не работает, было пять. Итог — 97 % ячеек товарных страниц отдавали MISS. Посетитель, открывший товар, почти всегда ждал полный рендер.

После доработки:

  • перечень из 1030 ячеек собирается автоматически;
  • MISS — 0 (HIT 1006, STALE 24);
  • тяжёлый блок товарной страницы — 3,64 → 0,30 с;
  • всплывающие формы — 14 из 14 из кэша, статьи — 320 из 320.

Десять компонентов гарантии

Список вырос из ошибок — каждый пункт добавлен после того, как без него кэш где-то «протёк». По ходу цикла разберём каждый:

  • чтение «отдай старое, обнови фоном» (stale-while-revalidate);
  • одна точка планирования фоновой задачи и сторож, который её поднимает, если она пропала;
  • защита по нагрузке ступенями, а не выключателем;
  • перечень страниц и блоков собирается сам;
  • сторож полноты: регулярная сверка «всё ли на месте»;
  • ускоренный догрев после выката;
  • наблюдаемость: видно, что происходит с кэшем;
  • изоляция рендера: фоновая сборка одной страницы не портит другую;
  • точечная чистка греет все варианты страницы;
  • при длинном сроке жизни кэша каждый пропущенный сброс стоит до недели — инвалидация обязана быть полной.

Индикаторы. Статус кэша страницы виден в заголовке ответа X-Cache-Status, статус фрагмента — в своём заголовке. Всё, о чём идёт речь в цикле, проверяется этими двумя заголовками и журналами.

В следующих частях — три параметра nginx, которые все путают, сколько стоит «короткий» кэш и почему мы в итоге храним страницы неделю.

Посетители ждут, хотя «кэш включён»?

Пришлите адрес — проверю, сколько страниц у вас реально отдаются из кэша и где MISS.

· полезно?
АЧ
Алексей Чикун веб-разработчик, команда TRIOHEAD

Делаю сайты и сервисы целиком: от вёрстки до сервера. Пишу о том, что проверил на своих проектах.

Комментарии

// загружаю комментарии…

Комментарии публикуются после проверки. Ссылки и HTML не принимаются.