Кладовочка

О разном, чтобы было под рукой онлайн

Микросервисы vs монолит: когда что выбирать — полный разбор

«Монолит — это legacy. Микросервисы — это modern». Если вы слышите такой аргумент при выборе архитектуры — бегите. Выбор между монолитом и микросервисами не про «старое vs новое». Это инженерное решение с конкретными критериями, компромиссами и ценой ошибки.

Не догма, а спектр

Прежде всего: это не бинарный выбор. Реальные системы находятся в спектре:

Монолит → Модульный монолит → Сервис-ориентированная → Микросервисы → Наносервисы
Тип Суть Пример
Монолит Одна кодовая база, один деплой, одна БД Shopify (на старте)
Модульный монолит Одна кодовая база, но строгие границы модулей. Можно выделить сервис позже Shopify (сейчас)
SOA Несколько сервисов, общая шина данных Enterprise-системы
Микросервисы Много независимых сервисов, свои БД, свой деплой Netflix, Uber
Наносервисы Функция = сервис. Почти всегда перебор Эксперименты Amazon Lambda

Большинству проектов нужен модульный монолит. Микросервисы — для очень специфических условий.

Критерии выбора

1. Размер команды — главный критерий

Команда Рекомендация
1–5 разработчиков Монолит. Микросервисы съедят всё время на инфраструктуру
5–20 (2–3 команды) Модульный монолит. Сервисы выделять точечно по мере роста
20–50 (4–8 команд) Начало микросервисов. Выделять по границам команд
50+ Микросервисы оправданы

Правило Конвея: архитектура системы отражает структуру коммуникаций организации. Если у вас 2 команды и 20 микросервисов — вы нарушили правило Конвея и будете страдать.

2. Сложность домена

Домен Рекомендация
Простой, понятный, стабильный Монолит. Микросервисы добавят сложности без пользы
Сложный, с разными скорингами в разных модулях Модульный монолит с перспективой выделения
Сложный, разные команды владеют разными частями Микросервисы по границам доменов (Domain-Driven Design)

Если вы не можете провести границы bounded context'ов — вам рано в микросервисы. Непонимание границ → размазанная логика между сервисами → распределённый монолит. Это худшее из обоих миров: сложность микросервисов + связанность монолита.

3. Масштабирование

Микросервисы нужны, если:

  • Разные части системы требуют radically разного масштабирования (поиск — 10 000 RPS, админка — 10 RPS)
  • Разные части требуют разных технологических стеков (поиск на Go, отчёты на Python, API на Java)

Монолит достаточен, если:

  • Вся система масштабируется одинаково
  • Можно масштабировать монолит горизонтально (несколько экземпляров за балансировщиком)

Netflix перешёл на микросервисы не потому что «это модно», а потому что их монолит не справлялся с сотнями миллионов пользователей.

4. Скорость разработки и частота деплоя

Ситуация Выбор
Нужно быстро выкатить MVP, проверить гипотезу Монолит
Релизы каждые 3–6 месяцев Монолит
10 команд деплоят независимо, несколько раз в день Микросервисы
Одна команда деплоит раз в неделю Модульный монолит

Парадокс скорости: на старте монолит радикально быстрее. Один репозиторий, один деплой, одна БД. Микросервисы на старте замедляют всё: CI/CD, тестирование, отладку, мониторинг. Их преимущество раскрывается только при ≥4 командах.

5. Требования к надёжности

Микросервисы помогают, если:

  • Отказ одного модуля не должен ронять всю систему (изоляция отказов)
  • Разные модули имеют разные SLA (платежи — 99.99%, рекомендации — 99%)

Монолит достаточен, если:

  • Отказ любого компонента = отказ всей системы — и это приемлемо (не финтех)

Чек-лист принятия решения

Перед выбором архитектуры — ответьте на вопросы. Если больше ответов в правой колонке — микросервисы. Если в левой — монолит.

Вопрос Монолит Микросервисы
Сколько команд? 1–3 4+
Как часто деплои? Раз в неделю Несколько раз в день
Разные команды владеют разными модулями? Нет, одна команда на всё Да, чёткое разделение
Нужно независимое масштабирование частей? Нет, система однородна Да, нагрузка неравномерна
Нужен разный техстек для частей? Нет, один язык/фреймворк Да, разные задачи требуют разного
Изоляция отказов критична? Нет, система простаивает целиком или работает Да, части могут отказывать независимо
Есть опыт распределённых систем? Нет Есть
Стадия продукта? MVP / ранний рост Масштабирование

Что делать, если вы уже в монолите и «пора» в микросервисы

Не «переписываем всё на микросервисы». Это убило больше проектов, чем любой баг.

Стратегия душителя (Strangler Fig):

  1. Выделите один bounded context — один модуль с чёткими границами
  2. Вынесите его в отдельный сервис, сохраняя всё остальное в монолите
  3. Наблюдайте 2–3 месяца: стало лучше? Какие неожиданные проблемы?
  4. Если ок — выделяйте следующий модуль. Если нет — верните обратно

Первый выделенный сервис — самый дорогой. Вы платите за инфраструктуру: service discovery, мониторинг, трейсинг, CI/CD. Каждый следующий — дешевле.

Распределённый монолит — главная опасность. Симптомы:

  • Изменение в сервисе A требует изменения в сервисе B
  • Сервисы деплоятся синхронно, всегда вместе
  • Сервисы используют одну БД
  • Отказ сервиса A роняет сервис B

Если вы видите эти симптомы — вы построили распределённый монолит. Варианта два: вернуться в монолит или перепроектировать границы сервисов.

Итог: начинайте с монолита

«Almost all the successful microservice stories have started with a monolith that got too big and was broken up» — Martin Fowler

Правильный путь: монолит → модульный монолит → выделение сервисов по мере роста команд. Не наоборот.

Микросервисы — решение проблем масштаба, а не проблем дизайна. Они не исправляют плохую архитектуру — они делают её распределённой и в 10 раз более дорогой в поддержке.

Связанные статьи на сайте

Что дальше


Связанные статьи: Архитектурные паттерны ИТ-систем: справочник 80+ концепций, 97 принципов архитектора ПО, Архитектурные роли в ИТ: кто какую архитектуру выбирает