Монолит и микросервисы в ecommerce: что выбрать и когда
За 14 лет в ecommerce я видел, как интернет-магазины переходят от коробки на Битриксе к проектам-осьминогам, где снаружи Битрикс, а внутри сервисы на Go. Спор «монолит и микросервисы» часто ведут как религиозный, хотя выбор зависит от нагрузки, команды и бюджета. Разбираю разницу подходов, типичные ошибки перехода и место composable в этой картине.
Пост, на основе которого написана статья: Composable в ecommerce: от коробки к интеграторам
В чём разница между монолитом и микросервисами
Монолит — одно приложение с общей кодовой базой и обычно одной базой данных. Каталог, корзина, заказы и личный кабинет живут вместе и выкатываются одним релизом.
Микросервисная схема делит систему на небольшие независимые приложения. У каждого своя зона ответственности, своё хранилище и свой цикл релизов, а общаются они по API или через очереди сообщений.
Термин закрепился после статьи Мартина Фаулера и Джеймса Льюиса «Microservices» в марте 2014 года. Идея старше: ещё закон Конвея 1968 года гласит, что архитектура системы повторяет структуру общения в организации.
Монолит или микросервисы: сравнение по главным параметрам
| Параметр | Монолит | Микросервисы |
|---|---|---|
| Старт проекта | Быстрый, одна команда | Дольше, нужна инфраструктура |
| Релизы | Всё целиком | Каждый сервис отдельно |
| Масштабирование | Копиями всего приложения | Только нагруженных частей |
| Отладка | Один стек вызовов | Нужны трассировка и логи по сервисам |
| Транзакции | Внутри одной базы | Распределённые, через саги |
| Команда | От 2–3 разработчиков | Несколько команд с DevOps |
Как ecommerce прошёл путь от коробки к сервисам
Когда я начинал, нормой считалось развернуть коробку для интернет-магазина и плавно её дописывать. Даже крупные игроки вроде Эльдорадо и Hoff запускались на Битриксе. Нагрузки были маленькими, правила игры проще.
Пандемия всё поменяла. Онлайн-торговля выросла кратно, и коробочные решения стали упираться в пиковые нагрузки. Появились проекты-осьминоги: витрина и админка остаются на Битриксе, а тяжёлые части — расчёт цен, остатки, поиск — выносят в отдельные сервисы на Go.
Почему гибрид встречается чаще чистых схем
Переписать работающий магазин с нуля дорого и рискованно. Поэтому компании выносят наружу то, что болит сильнее всего, и оставляют остальное в монолите.
У этого приёма есть имя — паттерн Strangler Fig, который Фаулер описал в 2004 году. Новые сервисы постепенно оплетают старую систему, как фикус-душитель дерево, пока монолит не становится маленьким ядром.
Когда монолит выигрывает
Для большинства магазинов хорошо организованный монолит дешевле и быстрее. Фаулер в заметке «MonolithFirst» 2015 года советовал начинать именно с него и дробить систему, когда станут видны границы модулей.
Показательный случай — Amazon Prime Video. В 2023 году команда сервиса мониторинга видео перевела его с распределённой схемы на монолит и, по собственному отчёту, снизила затраты на инфраструктуру на 90%.
Shopify тоже живёт на модульном монолите на Ruby on Rails: код поделён на компоненты с жёсткими границами, но выкатывается одним приложением.
Признаки, что пора дробить
- Релиз одной функции блокирует работу нескольких команд.
- Отдельная часть, например поиск или расчёт цен, требует в разы больше ресурсов, чем остальное.
- Сборка и тесты идут больше часа, и разработчики ждут результата дольше, чем пишут код.
- Разные модули нужно обновлять с разной скоростью.
Цена микросервисов, о которой забывают
Распределённая система требует инфраструктуры: оркестрации в Kubernetes, централизованных логов, трассировки, мониторинга и отдельного DevOps-инженера. Без этого десять сервисов превращаются в десять мест, где может спрятаться ошибка.
Вторая статья расходов — данные. Заказ, который раньше сохранялся одной транзакцией, теперь проходит через несколько сервисов. Для согласованности используют паттерн «сага» и компенсирующие операции, а это заметно сложнее обычного отката.
Третья статья — сеть. Вызов функции внутри монолита занимает микросекунды, сетевой запрос между сервисами — миллисекунды и может не дойти вовсе. Поэтому в каждом сервисе нужны таймауты, повторные попытки и защита от каскадных отказов, например паттерн Circuit Breaker.
Модульный монолит как компромисс
Между двумя крайностями есть промежуточный вариант. Код делят на модули по бизнес-доменам: каталог, заказы, оплата, лояльность. Модули общаются через явные интерфейсы и не лезут в таблицы друг друга, но собираются и выкатываются одним приложением.
Такой подход даёт главное преимущество микросервисов — понятные границы и независимую работу команд — без затрат на распределённую инфраструктуру. Если позже какой-то модуль упрётся в нагрузку, его проще вынести в отдельный сервис: граница уже проведена.
Для PHP-проектов на Laravel или Symfony это решается структурой пакетов и правилами зависимостей. Проверить, что модули не нарушают границы, помогают статические анализаторы вроде Deptrac.
Ошибки перехода
- Делить систему по техническим слоям, а не по бизнес-доменам.
- Оставить общую базу данных для всех сервисов и получить распределённый монолит.
- Начать дробление без мониторинга и трассировки.
- Перейти ради моды, когда узкое место — медленные запросы к базе, которые лечатся индексами и кешем.
Composable: следующий шаг после спора
Пока команды спорят, что лучше, рынок пошёл дальше. В ecommerce появились готовые системы с бизнес-функциями — PBC, Packaged Business Capability. Поиск, PIM, OMS, промо и лояльность покупают у вендоров и подключают как кубики.
Одних умных поисков на российском рынке уже больше трёх, хотя весь этот рынок оценивается примерно в 300 млн рублей в год. Классов таких систем больше 15, а самих систем — несколько сотен. Десять лет назад ElasticSearch разворачивали сами, сегодня соответствовать ожиданиям покупателей — это сотни часов разработки.
В итоге проекты запускаются быстрее и дешевле, порог входа ниже. Но выбор усложняется: нужно разбираться в десятках вендоров, сравнивать их API, лицензии и стоимость владения. Рынок всё сильнее делится на вендоров и интеграторов.
Что остаётся своей разработке
Заказной разработки становится меньше, но работы хватает. Кто-то должен сопровождать core-систему, которая оркестрирует интеграции, обеспечивает graceful degradation и делает пользовательский опыт бесшовным.
Если поиск вендора упал, магазин должен показать базовую выдачу, а не пустую страницу. Эта логика и есть главная ценность разработчиков, которые превращаются в интеграторов.
Вопросы и ответы
В чём главная разница между монолитом и микросервисами?
Монолит выкатывается и масштабируется целиком, микросервисы — по частям. За гибкость приходится платить инфраструктурой, мониторингом и сложной работой с данными.
Что выбрать для интернет-магазина на старте?
Хорошо организованный монолит. Отдельные сервисы стоит выносить, когда конкретная часть системы упирается в нагрузку или тормозит релизы.
Что такое проект-осьминог?
Так я называю гибрид, где снаружи Битрикс, а внутри тяжёлые функции работают в отдельных сервисах на Go. Такие проекты массово появились после роста онлайн-торговли в пандемию.
Что такое модульный монолит?
Это одно приложение, внутри которого код разделён на модули по бизнес-доменам с явными границами. Он собирается целиком, но любой модуль при необходимости проще вынести в отдельный сервис.
Чем composable отличается от микросервисов?
Микросервисы команда пишет сама. В composable компания собирает систему из готовых продуктов вендоров с бизнес-функциями и сама поддерживает только ядро и интеграции.