У кэша сайта обычно одна цель — «чтобы было быстро». Её невозможно проверить: быстро для кого, когда, на какой странице? Мы сформулировали цель иначе, и от этой формулировки потом выросли все решения, о которых пойдёт речь в цикле.
Что бы ни сбросило кэш — правка в админке, выкат, обмен с 1С, генератор миниатюр, — система сама подхватывает устаревшее и ставит в обновление. Посетитель в худшем случае получает STALE, но никогда — MISS.
цель, как её сформулировал заказчик
Это первая часть цикла «Кэш страниц без MISS».
Три статуса и что они значат
| Статус | Что произошло | Как к этому относиться |
|---|---|---|
| HIT | страница отдана из кэша, она свежая | хорошо, но не самоцель |
| STALE | отдана устаревшая копия мгновенно, обновление идёт фоном | норма: посетитель ничего не ждёт |
| MISS | копии нет, страница собирается при посетителе | отказ: человек ждёт полный рендер — секунды |
Отсюда главный сдвиг: мерить нужно MISS, а не HIT. На сайте с живым обменом данных HIT в 100 % не бывает никогда — что-то всегда обновляется. А вот MISS можно свести к нулю. Единственный допустимый MISS — у страницы, созданной секунды назад.
Три слоя кэша
- Страницы. Готовый HTML в кэше nginx (fastcgi_cache). Отдаётся за десятки миллисекунд без участия PHP.
- Фрагменты. Блоки, которые страница догружает отдельным запросом (ajax). nginx их не кэширует — им нужен свой кэш; о нём отдельный цикл.
- Перечень того, что должно быть в кэше. Про этот слой забывают чаще всего, а без него гарантия невозможна: нельзя гарантировать, что всё в кэше, если неизвестно, что такое «всё».
Чем это закончилось на живом сайте
На каталоге среднего размера с обменом 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.
// загружаю комментарии…