Получить доступ

Популярный ключ истекает, и сотни параллельных запросов одновременно уходят в базу за одним значением. Какие приёмы защищают от этого?

MiddleКэширование и CDN
Ещё спрашивают так:
  • Что такое cache stampede?
  • Как защититься от давки при истечении ключа?
Коротко

Популярный ключ истёк — сотни запросов разом идут в базу. Защита: разброс TTL, пересчёт в один поток (single flight), выдача устаревшего с фоновым обновлением.

  • Разброс TTL разводит истечения во времени — минимальная мера
  • Single flight: первый запрос идёт в базу, остальные ждут его результат
  • Stale-while-revalidate: ответ мгновенный, обновление асинхронное

А ещё Одинаковый TTL у всех горячих ключей — прямая причина давки

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Давка возникает из-за совпадения двух условий: ключ популярен и промахивается одновременно у многих клиентов. Разброс времени жизни разводит истечение во времени и стоит одну строку кода — это минимальная обязательная мера. Пересчёт в один поток решает задачу точнее: первый запрос берёт блокировку и идёт в базу, остальные ждут результат или получают предыдущее значение, поэтому источник получает ровно один запрос независимо от числа клиентов. Выдача устаревшего значения с фоновым обновлением обычно лучше всего для пользователя: ответ приходит немедленно, а свежесть подтягивается асинхронно. Одинаковое время жизни для всех горячих ключей — прямая причина проблемы: тысячи ключей истекают в одну секунду и дают базе согласованный залп. Стоит помнить и о смежных сценариях: запросы к несуществующим ключам всегда идут мимо кэша, поэтому кэшируют и отрицательный результат, а при полной недоступности кэша спасает уже не кэш, а ограничение конкурентных обращений к базе.

Что хотят услышать

  • Механизм давки.
  • Три приёма и их сравнение.
  • Смежные сценарии: отрицательное кэширование, падение кэша.

Частые ошибки

  • Обновлять горячие ключи по расписанию всем сразу и получать периодические всплески на базе.
  • Считать давку редкой ситуацией, пока кэш не перезапустился.

Проверьте себя

Несколько верных вариантов. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Добавить случайный разброс к времени жизни ключей
  • ✓Пересчитывать значение в один поток: первый запрос идёт в базу, остальные ждут результат
  • ✓Отдавать устаревшее значение сразу и обновлять его в фоне
  • ✗Задать всем горячим ключам одинаковое время жизни, чтобы обновлять их предсказуемо

Что спросят дальше

  • Чем cache penetration отличается от stampede и как от него защищаться?
  • Что произойдёт при полной недоступности кэша и как к этому подготовиться?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем