модульный монолит или микросервисы: что выбрать команде

В современной IT-индустрии сложился опасный культ микросервисов. Стоит стартапу привлечь первые инвестиции или команде вырасти до 15 человек, как в чатах начинают звучать призывы: «Пора переходить на микросервисы, иначе мы не масштабируемся!». В итоге проекты, которые могли бы взлететь за три месяца, тонут в настройке Kubernetes, распределенных транзакциях и бесконечной отладке сетевых задержек.
Как специалист, прошедший через обе эти крайности, я хочу разобрать, почему «золотая середина» в виде модульного монолита сегодня становится главным трендом для разумных команд.
Ловушка «масштабируемости»
Прежде чем выбирать инструмент, нужно понять, что именно мы масштабируем. В индустрии путают два разных понятия:
- Техническое масштабирование (способность системы выдерживать миллионы RPS).
- Организационное масштабирование (способность 100 разработчиков писать код, не мешая друг другу).
Микросервисы решают вторую проблему гораздо лучше первой. Если у вас команда из 5-10 человек, внедрение микросервисов создаст столько накладных расходов на инфраструктуру, что скорость разработки упадет в разы. Вы будете тратить 40% времени не на фичи, а на борьбу с «сетью».
Что такое модульный монолит на самом деле?
Многие ошибочно приравнивают монолит к «большому комку грязи» (Big Ball of Mud), где всё перемешано, а изменение в модуле оплаты внезапно ломает модуль рассылки писем. Но модульный монолит — это принципиально другой подход.
Это приложение, которое развернуто как единый процесс (один бинарный файл, одна база данных), но внутри строго разделено на независимые модули. Каждый модуль имеет:
-
- Свой собственный API для взаимодействия с другими частями системы.
-
- Свою внутреннюю логику, скрытую от внешнего мира.
-
- (В идеале) Свою схему данных, к которой никто другой не имеет прямого доступа.
По сути, это микросервисы, которые живут в одном процессе и общаются через вызовы функций в памяти, а не через HTTP или очереди сообщений.
Микросервисы: когда это оправдано?
Я не буду говорить, что микросервисы — это зло. Это мощный инструмент, но он имеет очень высокую «цену входа». Переходить на них стоит только в следующих случаях:
- Разные требования к ресурсам. Например, один модуль занимается тяжелой обработкой видео (нужны GPU и много RAM), а другой — простой записью логов (нужен минимум ресурсов).
- Разный стек технологий. Вам нужно написать один сервис на Go для высокой производительности, а другой на Python для ML-моделей.
- Огромная команда (от 50+ человек). Когда координация правок в одном репозитории превращается в ад из конфликтов слияния (merge conflicts) и бесконечных ожиданий в CI/CD пайплайне.
- Независимый цикл релизов. Когда отдел логистики должен выкатывать обновления 10 раз в день, а отдел финансовой отчетности — раз в месяц, и они не должны зависеть друг от друга.
Сравнение подходов: прагматичный взгляд
Давайте разберем основные аспекты выбора по пунктам.
1. Сложность разработки и отладки
В монолите вы запускаете проект одной кнопкой «Run» в IDE. Вы можете проследить путь запроса от контроллера до базы данных с помощью обычного стека вызовов.
В микросервисах вы получаете распределенную систему. Чтобы понять, почему запрос упал, вам понадобится:
-
- Распределенная трассировка (Jaeger, Zipkin).
-
- Централизованный сбор логов (ELK или Grafana Loki).
-
- Понимание того, что сеть нестабильна (таймауты, ретраи, Circuit Breaker).
2. Целостность данных и транзакции
Это самая болезненная точка. В монолите у вас есть ACID-транзакции. Либо деньги списались и товар забронировался, либо ничего не произошло.
В микросервисах вы сталкиваетесь с проблемой распределенных транзакций. Вам придется изучать паттерн Saga или Eventual Consistency (согласованность в конечном счете). Это кратно усложняет бизнес-логику: теперь вам нужно думать, как «откатить» операцию в трех разных сервисах, если четвертый вернул ошибку.
3. Стоимость владения (TCO)
Микросервисы требуют отдельной инфраструктуры для каждого сервиса: мониторинг, CI/CD пайплайны, секреты, конфигурации. Каждый новый сервис — это новые расходы на DevOps. Модульный монолит требует одного пайплайна и одного мониторинга.
Почему модульный монолит — лучший старт?
Если вы начинаете новый проект или рефакторите старый, я рекомендую путь «от простого к сложному». Модульный монолит дает вам преимущества обоих миров:
- Быстрый Time-to-Market. Вы фокусируетесь на бизнесе, а не на инфраструктуре.
- Легкость рефакторинга. Передвинуть границу между модулями внутри одного проекта — это дело одного дня. Перенести функционал из одного микросервиса в другой — это переписывание API, миграция данных и перенастройка сети.
- Путь к миграции. Если ваш модульный монолит спроектирован правильно (с четкими границами), то выделение отдельного модуля в отдельный микросервис в будущем займет минимум усилий. Вы просто выносите код в новый репозиторий и меняете вызов функции на HTTP-запрос.
Чек-лист для выбора архитектуры
Чтобы определиться, ответьте честно на следующие вопросы:
Сколько у нас разработчиков?
-
- До 20 человек $\rightarrow$ Модульный монолит.
-
- Больше 50 человек $\rightarrow$ Рассмотрите микросервисы.
Насколько четко определены границы доменных областей?
-
- Мы еще экспериментируем и меняем бизнес-логику $\rightarrow$ Модульный монолит (границы будут меняться, и в монолите это дешево).
-
- Домены стабильны и не пересекаются $\rightarrow$ Микросервисы.
Есть ли у нас выделенная команда DevOps?
-
- Нет, разработчики сами настраивают сервер $\rightarrow$ Модульный монолит.
-
- Да, у нас есть профи, которые настроят K8s и Service Mesh $\rightarrow$ Микросервисы.
Критична ли для нас абсолютная доступность отдельных частей системы?
-
- Если упадет всё — не страшно, починим за 5 минут $\rightarrow$ Модульный монолит.
-
- Если упадет модуль аналитики, поиск и оплата должны продолжать работать $\rightarrow$ Микросервисы.
Итог: стратегия выживания
Мой совет как архитектора: начинайте с модульного монолита. Инвестируйте время не в Kubernetes, а в чистоту архитектуры. Используйте принципы Domain-Driven Design (DDD), выделяйте контексты, запретите прямые обращения к таблицам соседних модулей.
Помните, что разделение системы на части — это операция, которую легко провести, но почти невозможно обратить вспять. Разрезать монолит на части можно всегда. А вот пытаться объединить разрозненные микросервисы обратно в монолит (что сейчас делают многие компании в рамках тренда «Macroservices») — это мучительный процесс, который часто заканчивается переписыванием системы с нуля.
Выбирайте инструмент под свои задачи, а не под модные статьи в блогах крупных тех-гигантов. Google и Netflix используют микросервисы не потому, что это «лучше», а потому, что у них десятки тысяч инженеров и нагрузки, которые невозможно обработать иначе. Для 95% компаний модульный монолит будет более эффективным, дешевым и быстрым решением.

