Как один ключ уронил интернет-магазин

Хочу рассказать вам про 25 декабря, которое я запомнил на всю жизнь.

Когда я работал в МТС, нам пришла задача от руководства: собрать новый фронт интернет-магазина на Nuxt поверх пятилетнего монолита на Битриксе. Это был старт работ по новому брендингу и распилу монолита. Бэкенда ещё не было, подрядчики только прорабатывали API, а встать в прод надо было за три месяца.

Решили проектировать контракты сами и подняли сервис на Node.js. Он эмулировал бэкенд, отдавал моки и Swagger, а на каждом билде генерировал из DTO типы и клиентские ручки API. Разработка шла как в стартапе, бэк регулярно выкатывал релизы с неконсистентными данными, поэтому схемы мы валидировали строго.

Так вот. 25 декабря, пятница, разгар предновогодних покупок. Я выкатил крошечный хотфикс на пару строк, лично всё проверил и пошёл с командой праздновать.

По дороге посыпались сообщения от коллег и директора департамента: во всех категориях пропали карточки товаров.

Первая мысль: хотфикс я катил сам, там всё чисто, ошибки быть не могло. Скорее всего, виноваты бэки или девопсы.

Дошли до ресторана, открываю ноутбук и начинаю разбираться. Кэш проверил, сброшен. Статика доехала, данные по товарам от бэка приходят. И тут до меня начинает доходить: контракт-сервис крутился у нас в одном экземпляре сразу для дева и прода.

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

Фикс занял одну строку. Магазин ожил на сороковой минуте простоя.

Меня не уволили и я всё же поел пиццу в тот вечер, но вынес из ситуации следующие выводы:

1️⃣ Не стоит катить релизы перед выходными, в высокий сезон и в праздники, если у вас не продуманы алерты и быстрые автоматические откаты при деградации сервиса.

2️⃣ Единый источник правды на все окружения удобен в поддержке, но он теряет контекст финальных версий систем и не даёт тестировать изолированные сборки.

3️⃣ Сборку перед релизом надо тестировать на чистом препроде, который по данным и настройкам повторяет прод. Тип стенда вторичен, важна консистентность данных с боевым окружением. И если такой среды в вашем контуре нет, начинайте поднимать её уже сегодня.

А у вас были такие пятницы? Делитесь в комментариях своими историями, выводами и опытом 🙏🏼

#разработка #инцидент #фронтенд

Как один ключ уронил интернет-магазин | Сетка — социальная сеть от hh.ru