Как один ключ уронил интернет-магазин
Хочу рассказать вам про 25 декабря, которое я запомнил на всю жизнь.
Когда я работал в МТС, нам пришла задача от руководства: собрать новый фронт интернет-магазина на Nuxt поверх пятилетнего монолита на Битриксе. Это был старт работ по новому брендингу и распилу монолита. Бэкенда ещё не было, подрядчики только прорабатывали API, а встать в прод надо было за три месяца.
Решили проектировать контракты сами и подняли сервис на Node.js. Он эмулировал бэкенд, отдавал моки и Swagger, а на каждом билде генерировал из DTO типы и клиентские ручки API. Разработка шла как в стартапе, бэк регулярно выкатывал релизы с неконсистентными данными, поэтому схемы мы валидировали строго.
Так вот. 25 декабря, пятница, разгар предновогодних покупок. Я выкатил крошечный хотфикс на пару строк, лично всё проверил и пошёл с командой праздновать.
По дороге посыпались сообщения от коллег и директора департамента: во всех категориях пропали карточки товаров.
Первая мысль: хотфикс я катил сам, там всё чисто, ошибки быть не могло. Скорее всего, виноваты бэки или девопсы.
Дошли до ресторана, открываю ноутбук и начинаю разбираться. Кэш проверил, сброшен. Статика доехала, данные по товарам от бэка приходят. И тут до меня начинает доходить: контракт-сервис крутился у нас в одном экземпляре сразу для дева и прода.
Накануне мы выкатили фичу с новой коллекцией (коллекции связывают варианты одного товара: цвет, объём памяти, размер), поправили генератор типов и подняли под неё бэкенд. На деве всё сошлось: схема требует новый ключ, бэкенд его отдаёт. Прод-сборка хотфикса опросила тот же общий сервис и притащила ту же схему. Только на прод схема уехала, а бэкенд под неё нет. Валидатор забраковал объект без обязательного поля, и фронт перестал рисовать карточки.
Фикс занял одну строку. Магазин ожил на сороковой минуте простоя.
Меня не уволили и я всё же поел пиццу в тот вечер, но вынес из ситуации следующие выводы:
1️⃣ Не стоит катить релизы перед выходными, в высокий сезон и в праздники, если у вас не продуманы алерты и быстрые автоматические откаты при деградации сервиса.
2️⃣ Единый источник правды на все окружения удобен в поддержке, но он теряет контекст финальных версий систем и не даёт тестировать изолированные сборки.
3️⃣ Сборку перед релизом надо тестировать на чистом препроде, который по данным и настройкам повторяет прод. Тип стенда вторичен, важна консистентность данных с боевым окружением. И если такой среды в вашем контуре нет, начинайте поднимать её уже сегодня.
А у вас были такие пятницы? Делитесь в комментариях своими историями, выводами и опытом 🙏🏼
· 03.08
Из "законов Мерфи" - серьёзное решение принятое во второй половине дня в пятницу скорее всего неверное. Многие сантехники и электрики это могут подтвердить - не стоит совершать некоторые работы в пятницу, если не хочешь лишиться выходных
0
ответить
коммент скрыт — часть юзеров считает его токсичным или некорректным
коммент удалён
· 04.08
Ваша правда!
0
ответить
коммент скрыт — часть юзеров считает его токсичным или некорректным
ответ удалён