Задача о новой фиче, которую никто не видит - Академия Selectel

Задача о новой фиче, которую никто не видит

Артём Шумейко
Артём Шумейко Senior Python Backend-разработчик
24 мая 2025

Будет полезна разработчикам веб-приложений и сервисов.

Изображение записи

Текст подготовил Артём Шумейко — внештатный райтер, амбассадор Selectel и автор YouTube-канала о разработке.

Условие

В компании «ГигаПост» выпустили долгожданное обновление: на сайте появилась новая кнопка «Подписаться на тему». Интерфейс готов, API поддерживает, проверено на стенде — все работает как часы.

Но после релиза начались странности. Некоторые пользователи видят кнопку, а некоторые — нет. Кто-то говорит, что она появилась через сутки. Кто-то — что только после нажатия Ctrl+F5.

Команда фронтенда уверена — код задеплоен. Бэкенд-эндпоинт отвечает корректно. На тестовом стенде все видно. Даже сам разработчик открывает сайт на своем ноутбуке — кнопка есть.

Начали подозревать баг в логике отображения, потом — переключение языка, затем подумали про авторизацию. Но фича пропадает у пользователей даже с одинаковыми условиями.

И вот тогда кто-то предложил простую мысль: а пользователи вообще видят свежую версию сайта?

Задача

Почему часть пользователей не видит новую кнопку, хотя код задеплоили? В чем может быть причина? Где в цепочке доставки может остаться старая версия?

Решение

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

Во-первых, браузеры почти всегда сохраняют ранее загруженные файлы: скрипты, стили, изображения. Если при обновлении сайта названия этих файлов не меняются, браузер просто берет их из своей памяти, даже не делая повторный запрос к серверу. С его точки зрения, ничего не изменилось, и обновления не требуется. В результате пользователю показывается интерфейс из старой версии, без новой кнопки.

Во-вторых, между пользователем и сервером может стоять промежуточный слой: файловое хранилище, система доставки контента, балансировщик или прокси. Эти компоненты часто тоже сохраняют ответы от сервера, чтобы ускорить загрузку сайта и снизить нагрузку на инфраструктуру. Но если они закэшировали старую версию index.html, то даже при обновлении скриптов пользователь продолжает получать «входную точку» из прошлого, в которой про новую кнопку еще ничего не сказано. Все, что подключается из index.html, — это старые скрипты, старая логика, старый интерфейс.

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

И наконец, если сборка фронтенда каждый раз создает файлы с одними и теми же именами, это только усугубляет ситуацию. В таких случаях ни браузер, ни промежуточные серверы не могут понять, что содержимое изменилось, потому что для них main.js остался тем же самым файлом. Из-за этого новые фичи становятся «невидимыми» — они есть на сервере, но до пользователя не доходят.

Что еще порешать?