Популярный ключ истекает, и сотни параллельных запросов одновременно уходят в базу за одним значением. Какие приёмы защищают от этого?
- Что такое cache stampede?
- Как защититься от давки при истечении ключа?
Популярный ключ истёк — сотни запросов разом идут в базу. Защита: разброс TTL, пересчёт в один поток (single flight), выдача устаревшего с фоновым обновлением.
- Разброс TTL разводит истечения во времени — минимальная мера
- Single flight: первый запрос идёт в базу, остальные ждут его результат
- Stale-while-revalidate: ответ мгновенный, обновление асинхронное
А ещё Одинаковый TTL у всех горячих ключей — прямая причина давки
Подробно
Давка возникает из-за совпадения двух условий: ключ популярен и промахивается одновременно у многих клиентов. Разброс времени жизни разводит истечение во времени и стоит одну строку кода — это минимальная обязательная мера. Пересчёт в один поток решает задачу точнее: первый запрос берёт блокировку и идёт в базу, остальные ждут результат или получают предыдущее значение, поэтому источник получает ровно один запрос независимо от числа клиентов. Выдача устаревшего значения с фоновым обновлением обычно лучше всего для пользователя: ответ приходит немедленно, а свежесть подтягивается асинхронно. Одинаковое время жизни для всех горячих ключей — прямая причина проблемы: тысячи ключей истекают в одну секунду и дают базе согласованный залп. Стоит помнить и о смежных сценариях: запросы к несуществующим ключам всегда идут мимо кэша, поэтому кэшируют и отрицательный результат, а при полной недоступности кэша спасает уже не кэш, а ограничение конкурентных обращений к базе.
Что хотят услышать
- Механизм давки.
- Три приёма и их сравнение.
- Смежные сценарии: отрицательное кэширование, падение кэша.
Частые ошибки
- Обновлять горячие ключи по расписанию всем сразу и получать периодические всплески на базе.
- Считать давку редкой ситуацией, пока кэш не перезапустился.
Проверьте себя
Несколько верных вариантов. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓Добавить случайный разброс к времени жизни ключей
- ✓Пересчитывать значение в один поток: первый запрос идёт в базу, остальные ждут результат
- ✓Отдавать устаревшее значение сразу и обновлять его в фоне
- ✗Задать всем горячим ключам одинаковое время жизни, чтобы обновлять их предсказуемо
Что спросят дальше
- Чем cache penetration отличается от stampede и как от него защищаться?
- Что произойдёт при полной недоступности кэша и как к этому подготовиться?
Разбор темы
- Кэширование и CDN
Кэш как размен согласованности на задержку, hit rate и слои, стратегии чтения и записи, инвалидация и гонка с записью, stampede и лавина, вытеснение и горячие ключи, CDN и ключ кэша.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.