Кэширование: тот же ответ, запрошенный снова
Кэширование — это когда ты замечаешь, что компьютер получает один и тот же вопрос снова и снова, и решаешь сохранить ответ.
У тебя есть клиент, сервер и контракт между ними. А теперь посмотри, о чём сервер просят на самом деле. Страницу популярного магазина запрашивают тысячи раз в час тысячи разных людей, и ответ каждый раз один и тот же. Сервер заново читает из базы данных те же строки, заново собирает тот же JSON и отправляет те же байты — тысячи раз, ради одного факта, который изменился сегодня утром. Кэширование — это решение перестать так делать.
Кэширование работает не из-за хитроумного хранилища. Причина в форме реального трафика: запросы повторяются. Несколько вещей спрашивают очень часто, а большинство вещей — почти никогда. Когда один и тот же вопрос приходит тысячу раз, сделать работу один раз и сохранить ответ превращает тысячу работ в одну плюс девятьсот девяносто девять копий. Поэтому кэширование иногда и проваливается с треском: если каждый запрос действительно уникален — страница, персональная для каждого пользователя — переиспользовать нечего, и кэш только добавляет ещё один поиск перед настоящей работой.
Кэши живут на нескольких уровнях, и каждый уровень обменивает расстояние на контроль. Таблицу ниже стоит читать по столбцам: попадание ближе к пользователю — это быстрее и дешевле, но устаревшая копия ближе к пользователю ещё и труднее всего исправляется, потому что машина, которая её хранит, больше не под твоим контролем.
WHERE IT LIVES WHO SHARES IT HIT COST SIZE LIFETIME
-------------------- --------------- ----------- -------- ------------------
browser cache one user milliseconds smallest dies with the tab
CDN edge one city tens of ms large shared by strangers
application cache one service under a ms medium lives in RAM
database cache one query under a ms large lives next to the dataНа каждом уровне один и тот же обмен: чем ближе копия к пользователю, тем быстрее попадание и тем труднее её вернуть назад.У самой трудной части есть название: инвалидация. Когда цена в базе данных меняется, каждая сохранённая копия старой цены становится ложью, и сервер должен либо удалить эти копии, либо заставить их устареть. Сделать это правильно стоит настоящей работы. Можно устаревать по времени — просто, но неверно в течение нескольких минут. Можно устаревать при записи — правильно, но тогда каждый кусок кода, который меняет данные, обязан помнить, что надо сообщить кэшу, а такое правило легко забыть при исправлении бага в два часа ночи. Бесплатного варианта нет; есть только выбор, с какой ошибкой ты готов жить.
Значит, каждый кэш держит осознанную ставку: насколько устаревшим может быть этот ответ? Логотип может быть годовалым, и никто не заметит. Фотография товара — час. Цена — несколько секунд. Баланс на счёте — ноль, его не кэшируют вообще. Заметь: свежесть — это решение о продукте, а не техническое. Инженер, выбирающий max-age=60, на самом деле отвечает на вопрос: «допустимо ли, чтобы покупатель увидел цену, которая устарела на минуту?» Если ответ «нет», кэш надо исправлять в ту же секунду, когда меняется цена, а это уже другая и более дорогая схема.
Практика
Новостной сайт кэширует главную страницу на 10 минут. Заголовок исправили через 30 секунд после публикации. Что увидят читатели?
Подсказки
- Кэш — это копия, а копия не может быть правильнее оригинала, с которого её сняли.
- Спроси себя, что происходит между моментом, когда цена изменилась, и моментом, когда копия устарела.
14 XP
Сопоставь каждую вещь со сроком жизни в кэше, который для неё разумен.
Подсказки
- Цена и наличие меняются, пока ты смотришь на страницу, а логотип — нет.
- Чем ближе кэш к пользователю, тем дешевле попадание и тем труднее его исправить.
15 XP
Расставь по порядку, что происходит с закэшированным ответом.
Подсказки
- Правило, можно ли показывать сохранённую копию, решается один раз — когда ответ отправляют впервые.
- Копию сохраняют до того, как её кто-то сможет переиспользовать, а измеряешь ты именно переиспользование.
16 XP