almcreate Авторский IT-блог

Добавь кеш. Почему сломалось — разберёмся потом

Когда неправильный ответ приходит быстро и держится уверенно.

Александр Морозов · 5 окт 2026 · 3 мин чтения · 1 просмотр
Архивный ящик застыл в прозрачной глыбе льда, свежие листы остались снаружи
AI-иллюстрацияalmcreate

Карточка товара открывается три секунды. Кто-то предлагает посмотреть запросы. Зачем? Завернём результат в кеш на час. Повторное открытие — почти мгновенно. Задача закрыта, график красивый.

Через десять минут менеджер меняет цену. На сайте остаётся прежняя. «Нужно немного подождать», — объясняем мы. Только что у страницы появилась новая бизнес-логика: изменения принимаются быстро, публикуются по настроению таймера.

В ключ положи самое очевидное

Например, номер товара. Этого ведь достаточно, чтобы понять, какой товар перед нами. Почти.

Представим, что в сохранённый HTML попала персональная скидка. Первым страницу открыл постоянный клиент. Следующий посетитель получил его цену. Если там ещё и блок личного кабинета, обсуждение производительности можно временно отложить.

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

Особенно коварно, когда ошибка появляется только после определённой последовательности посетителей. По одному каждый сценарий работает. Вместе они обмениваются результатами.

Очистку оставь человеку

В админке появляется кнопка «Сбросить кеш». Сначала ею пользуются для диагностики. Потом после каждого изменения цены. Ещё позже поддержку учат начинать любой разговор словами: «А кеш чистили?»

Так инфраструктурная деталь получает должность в редакции.

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

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

Назначь одинаковый срок всему

Час — отличное круглое число. Для списка стран оно короткое, для остатка последнего билета — вечность. Зато конфигурация выглядит последовательно.

Я бы начинал со смысла допустимого отставания. Читатель переживёт слегка устаревший счётчик просмотров. Финальную возможность купить товар всё равно нужно проверять по надёжному источнику в операции покупки. Быстрая витрина не должна превращаться в обещание, которое оформление заказа не умеет выполнить.

И не стоит забывать момент, когда кеш пуст. После общего сброса популярная страница может одновременно запустить множество тяжёлых вычислений. Если исходный запрос мы так и не исследовали, он вернётся уже группой.

Сначала выясни, что именно тормозит

Возможно, в карточке десятки однотипных запросов. Возможно, внешний сервис вызывается прямо во время открытия страницы. Или мы каждый раз строим большой результат ради трёх полей. У этих причин разные способы лечения.

После измерения кеш часто остаётся хорошим решением. Но теперь понятно, какой результат сохраняем, кто может его получать, когда он устаревает и что происходит при промахе. Это уже конструкция, которую можно проверить.

Быстрый ответ приятен. Лично мне ещё хочется, чтобы после изменения цены он имел какое-то отношение к новой цене. Кнопка очистки в руках менеджера не должна быть скрытой кнопкой «Сохранить по-настоящему».

#антипаттерны #производительность #архитектура #кеширование

Соседние рубрики