Инвалидация кеша CDN: стратегии доставки свежего контента
CDN драматически улучшают производительность, кешируя контент на edge-серверах по всему миру. Но кеширование создаёт фундаментальную проблему: как обеспечить, чтобы пользователи видели обновлённый контент? Инвалидация кеша — процесс удаления или замены устаревшего кешированного контента — одна из сложнейших задач.
Почему инвалидация сложна
- Распределённое состояние: контент кеширован на сотнях edge-нод
- Задержка распространения: инвалидация занимает от секунд до минут
- Консистентность vs скорость: агрессивное кеширование = быстрее, но устаревшее
- Стоимость: некоторые CDN берут плату за операции purge
Стратегии инвалидации
1. Purge (очистка кеша)
Явно указать CDN удалить конкретные URL из кеша:
# Cloudflare API purge
curl -X POST "https://api.cloudflare.com/client/v4/zones/{zone_id}/purge_cache" \
-H "Authorization: Bearer {token}" \
-d '{"files":["https://example.com/styles.css"]}'
2. Cache-Busting (версионированные URL)
Добавление хеша или таймстампа к URL файлов:
<link rel="stylesheet" href="/css/main.css?v=a1b2c3d4">
<link rel="stylesheet" href="/css/main.a1b2c3d4.css">
Плюс: purge не нужен — новый URL = новая запись в кеше. Мгновенно для пользователей.
3. TTL-истечение
# Короткий TTL для HTML
Cache-Control: public, max-age=300
# Длинный TTL для версионированных ассетов
Cache-Control: public, max-age=31536000, immutable
# Без кеша для динамических API
Cache-Control: no-cache, no-store
4. Stale-While-Revalidate
Отдаёт устаревший контент, пока фоново получает свежий:
Cache-Control: public, max-age=300, stale-while-revalidate=86400
После 5 минут контент «устаревший», но отдаётся до 24 часов, пока CDN фетчит свежую копию.
5. Cache Tags (Surrogate Keys)
Теги для кешированных ответов с логическими идентификаторами:
# Заголовок ответа
Surrogate-Key: product-123 category-electronics homepage
# Очистка по тегу
curl -X POST "https://cdn.example.com/purge/product-123"
Стратегия по типу контента
| Контент | Стратегия | TTL |
|---|---|---|
| HTML-страницы | Короткий TTL + purge при публикации | 5-60 мин |
| CSS/JS (версионированные) | Cache-busting + immutable | 1 год |
| Изображения | Cache-busting | 1 год |
| API документацию-ответы | Короткий TTL или no-cache | 0-60 сек |
| Пользовательские | Без кеша CDN (private) | 0 |
| Шрифты | Длинный TTL + CORS | 1 год |
Лучшие практики
- Версионируйте статику: cache-busting устраняет проблему инвалидации
- stale-while-revalidate: быстрая доставка и eventual consistency
- Автоматизируйте purge: триггер при деплое или публикации через CI/CD
- Мониторьте cache hit rate: низкий показатель означает слишком короткие TTL
- Тестируйте инвалидацию: до того как понадобится в аварийной ситуации
- Слоистое кеширование: CDN → origin cache (Varnish/Redis) → application cache
Заключение
Лучшая стратегия инвалидации — избежать инвалидации. Используйте версионированные URL для статики. Для динамического контента — короткие TTL + stale-while-revalidate. Явный purge оставьте для срочных обновлений.
Проверьте ваш сайт прямо сейчас
Проверить →