Для стартапа, инди-хакера или небольшой команды ответ однозначный: начинайте с монолита. Микросервисы — это решение для проблем большого масштаба, которых у вас ещё нет. Разберём почему, и когда это правило стоит нарушить.
Что такое монолит и что такое микросервисы
Монолит
Монолитное приложение — это единый деплоируемый юнит. Вся бизнес-логика, API, фоновые задачи и UI (если есть) живут в одном кодовом репозитории и деплоятся вместе.
myapp/
├── api/
│ ├── users.py
│ ├── products.py
│ └── orders.py
├── services/
│ ├── email_service.py
│ └── payment_service.py
├── models/
│ ├── user.py
│ ├── product.py
│ └── order.py
├── workers/
│ └── background_tasks.py
└── main.py
Один процесс, одна база данных, один деплой.
Микросервисы
Микросервисная архитектура — это набор независимых, слабо связанных сервисов, каждый из которых:
- Имеет свою базу данных
- Деплоится независимо
- Общается с другими через API или message broker (RabbitMQ, Kafka)
- Разрабатывается и масштабируется независимо
services/
├── user-service/ # Python FastAPI, PostgreSQL
├── product-service/ # Go, MongoDB
├── order-service/ # Java, MySQL
├── notification-service/ # Node.js, Redis
└── api-gateway/ # Nginx + routing
Почему стартапу нужен монолит
Аргумент 1: Скорость разработки — это ваш главный актив
На ранней стадии стартапа главная задача — найти Product-Market Fit. Это требует быстрых итераций: запустили фичу, получили фидбек, изменили, запустили снова.
В монолите изменение функции заказов затрагивает один файл и один деплой. В микросервисах — нужно изменить API-контракт, обновить order-service, обновить api-gateway, проверить совместимость с product-service, синхронизировать версии.
Аргумент 2: Инфраструктура микросервисов стоит дорого
Исследования показывают: инфраструктура для микросервисов обходится в 3.75-6 раз дороже монолита при сопоставимой нагрузке. Для стартапа это прямые деньги из бюджета.
Что нужно для микросервисов:
- Kubernetes или аналог (оркестрация)
- Service Mesh (Istio, Linkerd) для коммуникации
- Распределённое логирование (ELK Stack или Loki)
- Distributed tracing (Jaeger, Zipkin)
- API Gateway
- Message Broker (Kafka, RabbitMQ)
- Отдельные CI/CD пайплайны для каждого сервиса
- DevOps-инженер, который всё это поддерживает
Всё это — до того, как у вас появился первый платный пользователь.
Аргумент 3: Распределённые системы — это сложно
В монолите: вызвать функцию = 0мс, всегда успешно. В микросервисах: HTTP-запрос к другому сервису = 1-10мс, может упасть, может timeout, может вернуть устаревшие данные.
Проблемы, которые появляются только в микросервисах:
- Частичный отказ (один сервис упал, другие работают)
- Распределённые транзакции (как отменить заказ, если payment-service упал после списания?)
- Eventual consistency (данные в разных сервисах могут быть рассинхронизированы)
- Версионирование API между сервисами
- Дедлоки через network calls
Аргумент 4: 42% компаний возвращаются к монолитам
По данным CNCF, около 42% компаний, начавших с микросервисов, в итоге вернулись к монолитам или модульным монолитам. Amazon, Netflix, Uber — они перешли на микросервисы имея тысячи инженеров, не сотни пользователей.
Модульный монолит: лучшее из двух миров
Модульный монолит — это монолит с чёткими внутренними границами между компонентами. Он даёт скорость монолита и готовность к декомпозиции при необходимости.
Как выглядит модульный монолит
# Модуль Users
# users/models.py, users/service.py, users/api.py
# Модуль Orders
# orders/models.py, orders/service.py, orders/api.py
# Модули НЕ обращаются напрямую к моделям друг друга
# Только через публичные интерфейсы (service functions)
# ПЛОХО: прямой доступ к модели другого модуля
from orders.models import Order # из users/
# ХОРОШО: через сервисный слой
from orders.service import get_user_orders # Публичный API модуля
Пример структуры на FastAPI
# app/modules/users/
# models.py — User SQLModel
# service.py — create_user, get_user, update_user
# api.py — FastAPI router
# events.py — события (UserCreated, UserUpdated)
# app/modules/orders/
# models.py — Order SQLModel
# service.py — create_order, cancel_order
# api.py — FastAPI router
# events.py — OrderCreated, OrderCancelled
# app/modules/payments/
# service.py — process_payment, refund
# api.py
# main.py — собираем всё вместе
from app.modules.users.api import router as users_router
from app.modules.orders.api import router as orders_router
from app.modules.payments.api import router as payments_router
app = FastAPI()
app.include_router(users_router, prefix="/users")
app.include_router(orders_router, prefix="/orders")
app.include_router(payments_router, prefix="/payments")
Такая архитектура: один деплой, одна БД, но чёткие границы. Когда вырастете — «отпилить» payments в отдельный сервис будет несложно.
Когда переходить на микросервисы
Реальные триггеры, а не теоретические:
Триггер 1: Команда мешает друг другу
Когда 3+ команды работают над одним репозиторием и постоянно конфликтуют при мерджах, тормозят деплой друг друга — это сигнал. Обычно это происходит при 20-50+ инженерах.
Триггер 2: Один компонент убивает всё
Например, тяжёлые вычисления (ML-обработка, конвертация видео) потребляют весь CPU и роняют API. Этот компонент стоит выделить в отдельный сервис с независимым масштабированием.
API (5 инстансов, 1 CPU) + Video Processing (2 инстанса, 16 CPU)
vs.
Монолит (7 инстансов, 17 CPU каждый) — неэффективно
Триггер 3: Разные технические требования
Если часть системы должна быть на Python (ML), часть на Go (high-performance API), часть на Node.js (real-time WebSocket) — микросервисы позволяют использовать правильный инструмент для каждой задачи.
Триггер 4: Изоляция критичных данных
Платёжные данные требуют PCI DSS compliance? Медицинские данные требуют HIPAA? Выделение в отдельный сервис упрощает аудит и compliance.
Практическое сравнение
| Критерий | Монолит | Микросервисы | |---|---|---| | Скорость разработки | Высокая | Низкая (особенно начало) | | Сложность деплоя | Низкая (один деплой) | Высокая (N деплоев) | | Отладка | Простая (один лог) | Сложная (distributed tracing) | | Стоимость инфраструктуры | Низкая | В 3-6 раз выше | | Масштабирование | Вертикальное / горизонтальное всего | Независимое для каждого сервиса | | Команда | 1-15 человек | 20+ человек | | Транзакции | ACID через ORM | Сложные (saga, two-phase commit) | | Время до первого деплоя | Минуты | Дни-недели | | Подходит для | Стартапы, MVP, инди-хакеры | Крупные компании, после PMF |
Реальные примеры
Истории успеха монолитов
- Basecamp — один из самых прибыльных SaaS на Rails, до сих пор монолит
- GitHub — долго был монолитом (Rails), перешёл на частичную декомпозицию только после многих лет
- Shopify — модульный монолит на Rails, 100M+ запросов в день
- Stack Overflow — один сервер долгое время обслуживал миллионы запросов
Когда микросервисы оправданы
- Netflix — 1000+ микросервисов, сотни инженеров, уникальные требования к масштабированию
- Amazon — декомпозиция по командам («pizza team»)
- Uber — географически распределённые операции с разными требованиями
Заметьте: все эти компании начали как монолиты.
Micro-SaaS: особый случай
Micro-SaaS — это маленький SaaS-продукт, решающий узкую задачу для нишевой аудитории. Обычно делается одним человеком (солопринером) или маленькой командой.
Для micro-SaaS ответ ещё более однозначен: монолит, и желательно максимально простой.
Идеальный стек для micro-SaaS в 2026:
- Django + PostgreSQL (или FastAPI + SQLModel)
- SQLite для начала (быстрый старт, одна команда деплоя)
- Railway или Render для хостинга (без DevOps)
- Stripe для платежей
Никаких Kubernetes, никакого Kafka, никаких микросервисов.
Когда начать думать о декомпозиции
Признаки, что монолит начинает мешать:
- Сборка и тесты занимают больше 10-15 минут
- Деплой занимает больше 30 минут
- Добавление новой фичи требует изменений в 10+ файлах
- Разные части системы имеют конфликтующие зависимости
- Один компонент регулярно роняет весь сервис
Первый шаг — не микросервисы, а модульный монолит с чёткими границами.
Бэкапы в монолите: проще, чем в микросервисах
Одно из неочевидных преимуществ монолита — простота резервного копирования. Одна база данных — один бэкап. В микросервисах у каждого сервиса своя БД, бэкапить нужно каждую, синхронизировать восстановление между ними.
Для монолита с PostgreSQL или SQLite бэкап настраивается через dbsend.ru за пять минут: один токен, расписание, и бэкап уходит в облако. Никаких дополнительных инструментов.
FAQ
Что делать, если я уже начал с микросервисов? Не паникуйте. Если система ещё маленькая — рассмотрите консолидацию: объедините связанные сервисы в один. Это называется «strangler fig в обратную сторону». Если уже в продакшене с реальной нагрузкой — оцените, действительно ли декомпозиция приносит проблемы. Иногда работающая система лучше идеальной.
Монолит — это всегда спагетти-код? Нет. Монолит может быть хорошо структурированным. Модульный монолит с чёткими границами между модулями — это не спагетти. Спагетти-код — это проблема дисциплины, а не архитектуры.
Можно ли начать с монолита и потом перейти на микросервисы? Да, и это стандартный путь. Ключ — проектировать монолит с чёткими модульными границами с самого начала. «Отпилить» хорошо изолированный модуль несложно. Распутать настоящее спагетти — задача на месяцы.
Serverless — это микросервисы? Serverless (AWS Lambda, Yandex Functions) — это функции-сервисы. Концептуально близко к микросервисам, но ещё более атомарно. Для стартапа serverless может быть хорошим выбором для конкретных задач (обработка файлов, webhook-и), но полностью serverless-монолит (через SST, Serverless Framework) имеет свои сложности.
Netflix на микросервисах — значит, это правильный путь? Netflix перешёл на микросервисы имея миллионы пользователей, сотни инженеров и уникальные требования к надёжности (они стримят видео 24/7 по всему миру). Ваш стартап с 100 пользователями — это другой контекст.
Когда микросервисы оправданы для небольшой команды? Если у вас есть компонент с принципиально разными требованиями: например, ML-модель для обработки данных (Python, GPU) и основное API (Go, низкая латентность). Или если нужна изоляция для compliance (PCI DSS, HIPAA). Но это исключение, не правило.