Стратегии кэширования на edge: от простого TTL до stale-while-revalidate
Кэширование — основа производительности CDN. Но выбор правильной стратегии зависит от типа контента, требований к свежести и паттернов доступа. Разберём основные подходы.
Cache-Control: основы
HTTP-заголовок Cache-Control определяет, как и как долго кэшировать ответ. Основные директивы:
# Кэшировать на CDN и в браузере на 1 час
Cache-Control: public, max-age=3600
# Только CDN, не браузер
Cache-Control: public, max-age=3600, private
# Не кэшировать
Cache-Control: no-store
# Всегда ревалидировать
Cache-Control: no-cache
Важно понимать разницу между no-cache и no-store:
no-store— не сохранять ответ вообщеno-cache— можно кэшировать, но обязательно ревалидировать перед использованием
Стратегия 1: Long TTL + Cache Busting
Для статических ресурсов (JS, CSS, изображения) лучшая стратегия — максимальный TTL с версионированием в URL:
Cache-Control: public, max-age=31536000, immutable
# URL содержит хэш контента
/assets/app.a1b2c3d4.js
Директива immutable говорит браузеру не ревалидировать ресурс даже при refresh страницы. Если контент изменится — изменится URL.
Когда использовать
- Статика с хэшем в имени файла
- Версионированные API-ответы
- Контент, который никогда не меняется
Стратегия 2: Short TTL
Для контента, который меняется регулярно, но небольшая задержка допустима:
Cache-Control: public, max-age=60
Кэш обновится через минуту. Подходит для:
- Списки товаров, каталоги
- Агрегированная аналитика
- RSS/Atom фиды
Стратегия 3: Stale-While-Revalidate
SWR — мощный паттерн, позволяющий отдавать устаревший контент пока обновляется кэш:
Cache-Control: public, max-age=60, stale-while-revalidate=3600
Как это работает:
- Первые 60 секунд — ответ «свежий», отдаётся из кэша
- 60-3660 секунд — ответ «устаревший», но отдаётся из кэша, а CDN асинхронно обновляет его
- После 3660 секунд — ждём ответ от origin
SWR обеспечивает мгновенные ответы для пользователей при сохранении относительной свежести данных.
Когда использовать
- Главная страница
- Профили пользователей
- Любой контент, где UX важнее абсолютной свежести
Стратегия 4: Stale-If-Error
Защита от падения origin:
Cache-Control: public, max-age=60, stale-if-error=86400
Если origin вернул ошибку (5xx), CDN отдаст устаревший кэш до 24 часов. Пользователи видят контент вместо страницы ошибки.
Инвалидация кэша
Иногда нужно немедленно очистить кэш — например, после публикации исправления. В EdgeByte это делается через API:
curl -X POST https://api.edgebyte.ru/v1/cdn/purge \
-H "Authorization: Bearer $API_KEY" \
-d '{"urls": ["https://example.com/page/*"]}'
Purge распространяется по всем edge-локациям за <300 мс.
Паттерны инвалидации
| Паттерн | Когда использовать |
|---|---|
| Purge by URL | Конкретная страница изменилась |
| Purge by prefix | Обновился раздел сайта |
| Purge by tag | Связанный контент (все товары бренда) |
| Purge all | Деплой новой версии |
Рекомендации по типам контента
| Тип | Стратегия | Cache-Control |
|---|---|---|
| JS/CSS с хэшем | Long TTL | max-age=31536000, immutable |
| Изображения | Long TTL | max-age=2592000 |
| HTML страницы | SWR | max-age=60, swr=3600 |
| API ответы | Short TTL | max-age=10 |
| Персональный контент | Не кэшировать | private, no-store |
Заключение
Правильная стратегия кэширования может снизить нагрузку на origin в 10-100 раз и обеспечить мгновенные ответы для пользователей. Начните с SWR для большинства контента и оптимизируйте по мере накопления данных о паттернах доступа.
В EdgeByte CDN все эти стратегии настраиваются через правила или программно через Edge Functions.