Проблемы деплоя headless commerce на MACH-архитектуре никогда не попадают на слайд с четырьмя аккуратными квадратиками. Microservices, API-first, Cloud-native, Headless — красивая аббревиатура, и на whiteboard она выглядит как будущее. А потом ты пытаешься реально выкатить это в прод, и разрыв между диаграммой и реальностью оказывается зверским. Я знаю, потому что месяцев шесть прожил не на той стороне этого разрыва.
Признание, от которого мне до сих пор неловко: наша стратегия отката звучала буквально так — «выкатить предыдущую версию и молиться». Хотел бы я преувеличивать.
Красивая аббревиатура, уродливая реальность
Обещание MACH — это независимость. Каждый сервис владеет своим жизненным циклом, релизится в своём ритме, масштабируется по своим правилам. Только вот про что молчат: независимость без координации — это не свобода, а хаос с дополнительными шагами.
У нас каждый микросервис имел свой собственный deployment-скрипт. Никаких общих стандартов. Конфигурацию окружений правили руками, сервис за сервисом. И ни у кого — ни у меня, ни у команды — не было честного ответа на самый простой вопрос в офисе: «что вообще сейчас крутится на staging?» Спрашиваешь троих — получаешь три разных ответа.
«Слабо связанные» сервисы на деле оказались связаны намертво — способами, которые диаграмма архитектуры вежливо скрывала:
- Проблемы service discovery: после передеплоя сервисы переставали надёжно находить друг друга.
- Зависимости по порядку деплоя: сервис B был бесполезен, пока не поднимется сервис A, и ничто это не контролировало.
- Кошмар с parity окружений: staging и прод расходились каждую неделю.
Момент, когда всё сложилось
Когда я в первый раз попытался откатить неудачный деплой, вся иллюзия рассыпалась. Не было ни одного места, которое знало бы правильное состояние системы. Каждый сервис — сам себе остров. Я откатил один — и тут же сломал API-контракт с двумя другими, которые ждали новую версию.
Вот тогда и щёлкнуло. У нас не проблема деплоя. У нас проблема координации. Никакие пайплайны не спасут, пока ни одна система не понимает, как части складываются в целое.
Как я собрал MACH Composer
Поэтому я собрал composer-слой поверх GitHub Actions — платформу, единственная задача которой относиться ко всем сервисам как к одному цельному деплой-юниту.
Всё сводится к одному конфигу. В нём описан каждый микросервис, его версия, его зависимости и его требования к инфраструктуре. Ты пушишь в main — и composer думает за тебя:
- Вычисляет правильный порядок деплоя из объявленных зависимостей.
- Разбирается с конфигурацией окружений, чтобы никто больше не правил значения руками.
- Прогоняет health checks после каждого выката и откатывает автоматически, если они падают.
Сверху — real-time дашборд, который показывает, какая версия какого сервиса крутится в каком окружении. Неизвестность была самой дорогой частью старого мира, и дашборд её прикончил. Больше никаких «выкатить и молиться». Больше никаких трёх ответов на один вопрос.
Архитектура снизу осталась прежней
Вот тут хочу быть честным, потому что в этом весь урок: сами сервисы не менялись. В этом и был смысл.
- Микросервисы остались независимыми, версионируемыми и тестируемыми по отдельности.
- API gateway дал всему единую точку входа.
- Service mesh взял на себя межсервисное общение: retries, circuit breakers, всю неблагодарную сантехнику.
- Terraform управлял инфраструктурным слоем, так что изменения в коде автоматически тянут за собой изменения в инфре, а не кто-то тыкает в консоль в одиннадцать вечера.
Мне не нужно было переписывать архитектуру. Мне нужно было, чтобы существовала платформа деплоя, на которой эту архитектуру можно реально выкатывать. Это очень разные задачи, и я слишком долго путал одну с другой.
Что бы я сказал себе прошлому
MACH — это по-настоящему. Оно работает. Но в это «работает» тихо зашиты шесть месяцев операционной боли, о которой не предупреждает ни один доклад с конференции. Четыре буквы описывают, как ты проектируешь систему. И ни слова о том, как ты её выкатываешь, откатываешь и хотя бы видишь.
Если бы я мог отправить одно сообщение в прошлое, оно было бы таким: не строй архитектуру раньше, чем построишь способ её деплоить. Я сделал в неправильном порядке — и мне до сих пор немного стыдно.
MACH без оркестрации деплоя — это не современная платформа. Это просто набор независимо падающих сервисов в очень красивой аббревиатуре.