SkillGridИзучай computer science на практике

Кэширование: тот же ответ, запрошенный снова

Кэширование — это когда ты замечаешь, что компьютер получает один и тот же вопрос снова и снова, и решаешь сохранить ответ.

14 мин · 45 XP

У тебя есть клиент, сервер и контракт между ними. А теперь посмотри, о чём сервер просят на самом деле. Страницу популярного магазина запрашивают тысячи раз в час тысячи разных людей, и ответ каждый раз один и тот же. Сервер заново читает из базы данных те же строки, заново собирает тот же JSON и отправляет те же байты — тысячи раз, ради одного факта, который изменился сегодня утром. Кэширование — это решение перестать так делать.

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

UserBrowser cacheServeropen the same page againhere it is, 0 ms, no networkthe browser kept a copy it was allowed to keepopen a page it has never seen200 OK, Cache-Control: max-age=60the answer may be reused for 60 seconds

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

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, на самом деле отвечает на вопрос: «допустимо ли, чтобы покупатель увидел цену, которая устарела на минуту?» Если ответ «нет», кэш надо исправлять в ту же секунду, когда меняется цена, а это уже другая и более дорогая схема.

Практика

  1. Новостной сайт кэширует главную страницу на 10 минут. Заголовок исправили через 30 секунд после публикации. Что увидят читатели?

    Подсказки
    • Кэш — это копия, а копия не может быть правильнее оригинала, с которого её сняли.
    • Спроси себя, что происходит между моментом, когда цена изменилась, и моментом, когда копия устарела.

    14 XP

  2. Сопоставь каждую вещь со сроком жизни в кэше, который для неё разумен.

    Подсказки
    • Цена и наличие меняются, пока ты смотришь на страницу, а логотип — нет.
    • Чем ближе кэш к пользователю, тем дешевле попадание и тем труднее его исправить.

    15 XP

  3. Расставь по порядку, что происходит с закэшированным ответом.

    Подсказки
    • Правило, можно ли показывать сохранённую копию, решается один раз — когда ответ отправляют впервые.
    • Копию сохраняют до того, как её кто-то сможет переиспользовать, а измеряешь ты именно переиспользование.

    16 XP