awesome-everything EN
↑ Обратно к восхождению

Сети и протоколы

Stale-while-revalidate и cache stampede

Суть Как stale-while-revalidate побеждает cache stampede, когда stale-if-error спасает при сбое origin, и четыре стратегии предотвращения thundering herd.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на senior-высоте — в орбите
◷ 12 min

Ровно в T+3600 секунд запись кеша вашей самой популярной статьи истекает на всех edge POP одновременно. Тысяча пользователей запрашивает страницу в следующую секунду. Каждый получает cache miss. Каждый генерирует запрос к origin. Origin видит трафик в 1000× от нормы и начинает таймаутить — а поскольку часть запросов завершилась таймаутом, CDN сохранил 503-ответ как новую запись кеша. Теперь все пользователи видят 503 следующие 3600 секунд.

Проблема cache stampede

Cache stampede (он же thundering herd — гремящее стадо) происходит, когда:

  1. Истекает популярный кешированный ответ.
  2. Одновременно приходит много конкурентных запросов после истечения.
  3. Все промахиваются по кешу и независимо обращаются к origin.
  4. Origin перегружен; часть запросов завершается таймаутом.
  5. CDN кеширует ответы с ошибками — ситуация ухудшается.

Без защиты коэффициент усиления равен (запросов/сек в момент истечения) × (время ответа origin). Страница с 500 req/s при 200 мс времени ответа origin может генерировать 100 одновременных запросов к origin — нагрузка в 100× от нормы.

stale-while-revalidate (SWR)

RFC 5861 определяет stale-while-revalidate=<seconds>:

Cache-Control: public, max-age=60, stale-while-revalidate=604800

После истечения max-age=60 секунд:

  • Немедленно отдавать устаревший ответ всем входящим запросам.
  • Отправить один фоновый запрос ревалидации к origin.
  • Кеш снова становится свежим после ответа origin.
  • Окно устаревания: max-age + stale-while-revalidate = 60 с + 7 дней.

Все 1000 конкурентных пользователей в T+60 по-прежнему получают ответ за ~20 мс (устаревший edge hit), тогда как origin видит ровно один запрос ревалидации. Stampede не происходит.

Trade-off: пользователи могут видеть контент, устаревший до stale-while-revalidate секунд. Для тела статьи (max-age=300, swr=3600) это означает, что контент может быть на 1 час устаревшим после истечения max-age. Для тикера срочных новостей неприемлемо — используйте короткий SWR или вообще без SWR.

stale-while-revalidate по типу контента
Тело статьи (допустимое устаревание 1ч)
max-age=300, stale-while-revalidate=3600
Листинг товаров (допустимое устаревание 10 мин)
max-age=60, stale-while-revalidate=600
Тикер срочных новостей (критична свежесть)
max-age=5, stale-while-revalidate=10
Статический ассет (URL с content-hash)
max-age=31536000, immutable — SWR не нужен
User-specific данные (баланс счёта)
no-store — кеширование полностью запрещено

stale-if-error: graceful degradation при сбое origin

RFC 5861 также определяет stale-if-error=<seconds>:

Cache-Control: public, max-age=3600, stale-if-error=86400

Когда origin возвращает 5xx или недоступен, кеш отдаёт устаревший ответ до stale-if-error секунд (1 день в примере) вместо возврата ошибки пользователям. Это CDN-эквивалент circuit breaker.

Где применять: маркетинговые страницы, документация, страницы статей — всё, где версия с задержкой в 1 день лучше, чем 503. Не применять для оформления заказа, платежей или любой операции, требующей реального времени.

Четыре стратегии защиты от stampede

СтратегияКак работаетЛучшее применение
Origin shieldСворачивает все edge-промахи в регионе в один запрос к originВсе уровни кеша
stale-while-revalidateНемедленно отдаёт устаревшее, один фоновый запрос ревалидацииИзменяемый контент, допустимое устаревание
Request coalescing (singleflight)На уровне приложения: первый промах запускает origin fetch; остальные ждут того же результатаУровень origin-приложения
Probabilistic early expiration (PER / XFetch)Стохастически обновляет немного до истечения TTL, распределяя нагрузку по времениВысоконагруженные кеши
Почему это работает

Почему origin shield — первая линия защиты. Без origin shield у каждого CDN edge POP отдельный кеш. Когда тот же URL истекает на 200 POP в регионе, все 200 независимо запрашивают origin. С origin shield все 200 edge направляют промахи через один shield-узел. Shield имеет собственный кеш (бо́льший, чем у любого отдельного edge); он делает максимум один запрос к origin на URL на регион. SWR добавляет второй слой: даже когда shield промахивается, пользователи по-прежнему видят устаревший ответ, пока один запрос к origin в полёте. Оба слоя вместе означают: истечение популярного URL генерирует ровно один запрос к origin глобально, а не по одному на edge или на конкурентного пользователя.

Проследи
1/4

Новостной сайт испытывает всплеск трафика 10× из-за вирусной статьи. Срабатывает alarm нагрузки origin несмотря на CDN. Диагностируйте.

1
Step 1 of 4
Шаг 1: проверить cache hit rate CDN во время всплеска. Показывает 30% вместо обычных 90%. Что это означает?
2
Locked
Шаг 2: изучить заголовки ответа статьи. Обнаружено: Vary: User-Agent. Почему это катастрофично для cache hit rate?
3
Locked
Шаг 3: какая немедленная мера защиты пока деплоится исправление?
4
Locked
Шаг 4: добавить stale-while-revalidate в Cache-Control статьи. Как изменится поведение при следующем всплеске?
Викторина

Почему stale-while-revalidate важен для защиты от cache stampede?

Какой RFC?

Какой RFC определяет расширения Cache-Control stale-while-revalidate и stale-if-error?

Проследи
1/4

Диагностика: пользователи в двух регионах видят разные версии одной страницы через 2 часа после деплоя.

1
Step 1 of 4
Шаг 1: убедиться, что оба edge получили деплой. Проверить last-modified origin через каждый edge.
2
Locked
Шаг 2: как долго до естественного истечения кеша B?
3
Locked
Шаг 3: как принудительно обновить прямо сейчас?
4
Locked
Шаг 4: как предотвратить это в будущих деплоях?
Вспомните перед уходом
  1. 01
    Объясните проблему cache stampede и почему stale-while-revalidate предотвращает её.
  2. 02
    При каких условиях НЕ следует использовать stale-while-revalidate?
  3. 03
    Что делает stale-if-error и как отличается от stale-while-revalidate?
Итог

Проблема cache stampede: популярная запись кеша истекает; много конкурентных пользователей генерируют одновременные запросы к origin; origin перегружен и может начать возвращать ошибки; эти ошибки кешируются. Четыре стратегии защиты: (1) origin shield, сворачивающий все edge-промахи в регионе в один запрос к origin; (2) stale-while-revalidate, отдающий устаревший ответ всем пользователям, отправляя один фоновый запрос ревалидации; (3) request coalescing на уровне приложения (singleflight), предотвращающий конкурентные запросы к origin; (4) probabilistic early expiration, распределяющий ревалидации по времени. stale-if-error (RFC 5861) добавляет graceful degradation: при сбое origin отдавать последнюю кешированную версию до N секунд вместо распространения ошибок. Выбирайте окна устаревания соответственно требованиям к корректности контента — статья терпит 10 минут устаревания; цена в checkout — не терпит и 10 секунд.

Связанные уроки
встречается в162
Продолжить восхождение ↑Edge workers и edge-side composition
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources3
expand
  1. 01
  2. 02
  3. 03

Trademarks belong to their respective owners. Editorial reference only.