Вопрос с собеседования · System design

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

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

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

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

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

Подробно

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

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

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

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

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

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

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

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

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

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

Разбор темы

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

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования