Привет, Хабр! Меня зовут Андрей Бирюков. Я — независимый эксперт в области ИТ и ИБ, преподаю в учебных центрах и пишу статьи и книги.
На тему сравнения микросервисов и монолита написано множество статей, и во многих из них преимущество отдаётся микросервисам, что вызывает вполне заслуженное недовольство части читателей.
Но архитектура ИТ‑систем — это не религия и не маркер «современности», а инструмент с разной ценой владения. Микросервисы решают организационную проблему (много команд, зрелый домен, потребность в независимых релизах), а не техническую.
И если у вас этой проблемы нет, то вы платите распределённую цену за несуществующую выгоду.
В этой статье мы рассмотрим критерии, скрытые издержки и правила, которые помогут принять решение без холивара и без лишних седых волос.
Когда начинать с монолита (и не стесняться этого)
Монолит, при всех его кажущихся недостатках, представляет собой рациональный выбор по умолчанию для большинства новых проектов. Microsoft говорит об этом прямо: монолитная архитектура может быть разумным первым шагом, особенно для proof‑of‑concept и MVP.

-
Так, если у вас команда 15–20 инженеров, то монолитная архитектура подойдёт вам лучше всего. Исследования показывают, что при командах меньше 20–30 человек накладные расходы на координацию микросервисов часто перевешивают выгоды.
-
Также, если границы вашего проекта ещё не определены чётко, то выделять сервисы по ним — риск получить в итоге гарантированный распределённый монолит. Помимо этого, монолит даёт самый быстрый маршрут от идеи до работающего продукта. На этом пути не надо тратить ресурсы на конвейер CI/CD, observability, service mesh, управление секретами и другие модные плюшки.
-
Монолит хорошо подойдёт там, где нагрузка ещё не упёрлась в потолок, нет измеренного bottleneck, который требует независимого масштабирования одного компонента, и бизнес‑логика требует ACID‑транзакций между сущностями (финансы, склад, заказы).

Но здесь важно сделать одно уточнение: «монолит» не означает «лапша». Модульный монолит имеет явные границы модулей внутри одного деплоя. Это часто недооценённая золотая середина, так как вы получаете простоту эксплуатации монолита и готовые швы для будущего выделения сервисов, если/когда это понадобится.
Итак, с монолитом разобрались. Теперь давайте рассмотрим преимущества микросервисов.
Когда сразу проектировать микросервисы (и не обманываться)
Надеюсь, прочтение предыдущего параграфа не привело читателя к мысли о том, что всё нужно строить только на монолите. Это, конечно же, не так. Микросервисы начинают окупаться при совпадении нескольких условий — не «одного», а именно комбинации.
-
У вас должно быть несколько (три и более) команд с разными циклами релизов, которые не блокируют друг друга общим пайплайном, так как независимый деплой — это главный выигрыш микросервисов. Помимо этого, вы должны понимать, где у вас находится узкое место в конкретном домене. Например, один компонент требует на порядок больше ресурсов, чем остальные (обработка видео vs личный кабинет).

-
Для вас критична изоляция отказов, то есть падение платёжного модуля не должно ронять каталог. Но помните: это лечится и на уровне процессов/пулов, и в монолите.
-
При этом домен должен быть достаточно зрелым, границы должны быть понятны, и вы не должны менять их каждые две недели.
-
Ну и должна быть платформенная зрелость, заключающаяся в наличии CI/CD на каждый сервис, distributed tracing, централизованных логов, service discovery и управления конфигурацией.
Но если вы отвечаете «да» на вопрос «хотим микросервисы», но не можете назвать ни одного измеренного bottleneck или организационного трения, которое они решают, — это преждевременная декомпозиция. «Возврат монолита» в 2025–2026 — это не отказ от распределённых систем, а коррекция именно преждевременной и организационно необоснованной декомпозиции.
Скрытые издержки или что не пишут в презентациях
А теперь давайте поговорим о тех недостатках, которые есть у каждой из архитектур, и начнем с монолита.

Первая проблема — связанность релизов. Любое изменение приводит к пересборке и деплою всего. Со временем это превращается в «религиозный» пайплайн, где одна команда ждёт другую. И это не техническая проблема, а организационная, и она проявляется при росте команды.
«Не откладывай на завтра то, что можно сделать послезавтра» — именно так звучит вторая проблема: иллюзия в стиле «потом отрефакторим».
Без дисциплины границы модулей размываются, и через год выясняется, что «выделить сервис» означает «переписать половину кода», потому что модули обросли скрытыми связями через общие таблицы и утилиты.
Ещё одной серьёзной проблемой является необходимость выполнять масштабирование целиком. Например, если 10% кода — это горячий путь, вы масштабируете все 100%. Это дорого и неэффективно, но это измеримая проблема. Но пока она не измерена, она не будет аргументом.
В результате мы рискуем получить монстра как результат ошибки проектирования на старте. Российская практика показывает, что системы превращаются в «монстров» не потому, что они монолиты, а потому что на старте архитекторы не заложили границы и не подумали о сопровождении.
Теперь давайте поговорим о микросервисах.
-
Здесь серьёзной проблемой является вызов метода по сети. Дело в том, что вызов в памяти занимает наносекунды, а вот сетевой вызов — уже миллисекунды, плюс сериализация, аутентификация, повторы, таймауты, частичные отказы. Всё, что в монолите было бесплатно, здесь становится, по сути, отдельным проектом.
-
Также в микросервисах технический долг растёт быстрее. Так, промышленное исследование показало, что плотность технического долга в микросервисах значительно увеличивается со временем, тогда как в изученном монолите она оставалась стабильной или снижалась. Скорость роста долга прежде всего связана с количеством сервисов.
-
Помимо этого, не стоит забывать и о стоимости облака и observability. Межсервисный трафик, sidecar‑прокси, распределённая трассировка, логирование — всё это счёт, который растёт незаметно. Для небольшой команды это может оказаться неподъёмным.
-
Из‑за сложности микросервисной архитектуры отладка зачастую становится археологией. Так, один запрос может проходить через 5 сервисов, а воспроизвести инцидент локально почти невозможно без зрелой observability. Соответственно, время на отладку растёт непропорционально.
-
Наконец, есть сложности деплоя: работа с API‑контрактами, версионированием и обратной совместимостью становится достаточно объёмной задачей, которую кто‑то должен выполнять. И часто это те же люди, что пишут код.
Как не уйти в избыточность и не накопить долг
Теперь давайте поговорим о балансе при выборе архитектуры. Здесь всегда начинайте с модульного монолита, если нет явных причин для обратного. Как уже упоминалось выше, модульный монолит — это не «монолит, который потом станет микросервисами». Это полноценная архитектура, которая, с одной стороны, даёт простоту эксплуатации одного деплоя, а с другой — сохраняет границы через интерфейсы модулей и позволяет выделить сервис позже по готовому шву, а не переписывать всё.

Далее, выделяйте сервис только по измеренной причине — не «потому что модно», а потому что:
-
команда X не может релизить независимо от команды Y (организационная причина);
-
компонент Z требует 10 x ресурсов по сравнению с остальными (техническая причина);
-
отказ компонента W должен быть изолирован по требованиям бизнеса (риск‑причина).
Если ни одной из этих причин нет, то такой сервис и не нужен, даже если очень хочется нарисовать стрелочки.
Не забывайте считать совокупную стоимость владения, а не только стоимость разработки. Монолит дешевле в разработке, но может стать дорогим в масштабировании и координации. Микросервисы дороже в разработке, инфраструктуре и observability с первого дня. Точка безубыточности обычно лежит там, где организационное трение монолита начинает стоить дороже, чем распределённая сложность. И для большинства случаев это не стартап на 5 человек.
А ещё важно помнить, что «распределённый монолит» — это, пожалуй, худший из миров. Например, если вы разделили сервисы, но они деплоятся вместе (или блокируют друг друга), при этом у них общая база данных и изменение в одном требует синхронного изменения в другом, то вы получили все минусы микросервисов без плюсов, то есть это не промежуточное состояние, а технический долг, который нужно целенаправленно устранять (либо обратно укрупнять).
Ну и преждевременная декомпозиция — это, по сути, такой же технический долг, как и отсутствие границ. Только он дороже: вы платите за него инфраструктурой, latency и когнитивной нагрузкой команды. «Мы потом выделим сервисы, когда будет нужно» — это плохая стратегия, если вы не заложили границы. Но подход «мы сразу сделаем микросервисы на всякий случай» будет ещё хуже.
Хотите проверить свои знания в архитектуре ПО? Пройдите вступительный тест и узнайте, какие темы стоит подтянуть.
Итоги
Итак, для принятия решения вам нужно определиться с тем, сколько команд будет работать над системой в ближайший год:
-
Если одна‑две, то лучше использовать монолит; если три и больше — микросервисы.
Если вы сейчас не можете точно назвать границы проекта, то лучше использовать монолит. Помимо этого, ответьте на вопрос: есть ли люди/бюджет на платформенную инженерию? Для применения микросервисов подойдёт только утвердительный ответ.
Ну и напоследок нужно понять, что для вас важнее на ближайшие 6 месяцев: скорость выхода или независимость релизов? Монолит подойдёт в первом случае.
Важно понимать, что хорошая архитектура не та, которая «выглядит современно на схеме», а та, которую команда может развивать без страха, эксплуатировать без героизма и менять без переписывания с нуля.
Монолит с чёткими границами и дисциплиной часто оказывается более «микросервисным» по духу (слабая связность, сильная инкапсуляция), чем десять сервисов, которые деплоятся вместе и ходят в одну базу.

Выбор архитектуры требует понимания того, как разные технологии ведут себя под нагрузкой и какие компромиссы стоят за каждым решением. Если хотите систематизировать знания и развить архитектурное мышление, присмотритесь к курсу «Архитектор программного обеспечения».
А углубиться в одну из технологий для построения отказоустойчивых систем можно на бесплатном открытом уроке:
-
23 ноября в 20:00. «NoSQL в бою: как Cassandra помогает строить отказоустойчивый бэкенд». Записаться
Другие вебинары ноября собрали в дайджесте мероприятий.
Источник: habr.com