Этот вопрос проверяет понимание, зачем используют микросервисы, какие проблемы они решают и какие новые сложности вносят по сравнению с монолитной архитектурой.
Микросервисы позволяют независимую разработку и деплой отдельных частей системы, упрощают масштабирование по частям и дают командам больше автономии и гибкости в выборе технологий. Это хорошо подходит для крупных продуктов с разными доменными областями и множеством команд.
Однако микросервисы усложняют инфраструктуру: появляется распределённость, сеть, управление конфигурацией, мониторинг, трассировка, проблемы согласованности данных и версионирования API.
Кроме того, возрастают требования к DevOps-практикам, оркестрации (например, Kubernetes), тестированию и культуре взаимодействия команд. Поэтому микросервисы оправданы не всегда, а в основном там, где монолит уже становится узким местом по масштабированию и скорости изменений.
Микросервисная архитектура делит систему на набор небольших сервисов, каждый из которых отвечает за свою предметную область и разворачивается независимо.
Определение:Микросервисная архитектура — это подход, при котором приложение состоит из набора небольших, слабо связанных сервисов, каждый из которых отвечает за определённую бизнес-функцию и может разрабатываться и деплоиться независимо.
Обычно микросервисы:
общаются по сети (HTTP/gRPC, очереди, события),
имеют собственные базы данных или схемы,
управляются системой оркестрации (часто Kubernetes).
2.1. Независимая разработка и деплой
каждая команда может:
развивать свой сервис,
релизить изменения без ожидания “общего релиза” монолита;
меньше риска, что одно изменение уронит всё приложение (при хорошем дизайне).
2.2. Гибкое масштабирование
разные сервисы можно масштабировать по-разному:
Auth держать на 3 репликах,
Reporting — на 1–2 (он менее нагружен),
Search — на 10 при пиковых нагрузках;
экономия ресурсов по сравнению с масштабированием всего монолита.
2.3. Разделение доменов и ответственности
каждый сервис отвечает за свой bounded context:
user-service,
order-service,
payment-service;
легче держать кодовую базу “чистой” и понятной для команды.
2.4. Свобода технологий
разные сервисы могут быть написаны на разных языках и использовать разные БД:
payment-service на Java + Postgres,
analytics-service на Python + ClickHouse;
позволяет выбирать лучший инструмент под конкретную задачу.
3.1. Рост инфраструктурной сложности
требуется:
оркестратор (Kubernetes или аналог),
сервис-дискавери,
API gateway / ingress,
централизованные логи, метрики, трассировка;
локальная разработка сложнее: поднять “все сервисы” у себя становится нетривиально.
3.2. Распределённость и ненадёжность сети
любой вызов между сервисами — сетевой:
возможны таймауты, повторные попытки, частичные отказы;
сложнее отлаживать проблемы: уже надо понимать распределённые системы, паттерны вроде circuit breaker, retry, backoff.
3.3. Согласованность данных
каждый сервис часто имеет свою БД:
нет “общей транзакции” между ними;
приходится:
использовать eventual consistency,
применять саги, события, очереди;
логика, которая в монолите решалась одной транзакцией, в микросервисах превращается в цепочку взаимодействий.
3.4. Сложнее тестирование и отладка
end-to-end тесты требуют поднятия множества сервисов;
контрактное тестирование между сервисами обязательно:
нужно гарантировать совместимость версий API;
без хороших практик наблюдаемости (логи, метрики, трассировка) поиск ошибок очень затрудняется.
3.5. Повышенные требования к DevOps и культуре
нужно:
CI/CD для каждого сервиса,
автоматизированные деплои,
управление секретами, конфигурацией, версиями;
без зрелых процессов микросервисы только усложнят жизнь.
Микросервисы очень часто деплоят в контейнерах (Docker) и управляют ими через Kubernetes:
каждый сервис — набор pod-ов;
сервисы масштабируются отдельными Deployment-ами;
API gateway/ingress управляет внешним трафиком;
наблюдаемость (Prometheus, Grafana, Jaeger и др.) становится обязательной частью.
Это усложняет старт, но сильно помогает, когда сервисов десятки или сотни.
Микросервисы стоит рассматривать, когда:
система большая и активно растёт;
есть несколько команд, которые мешают друг другу в монолите;
монолит трудно масштабировать по частям;
есть ресурсы на DevOps и инфраструктуру.
Микросервисы не всегда нужны, если:
продукт маленький или только начинается;
одна команда поддерживает весь код;
инфраструктура и процессы ещё не зрелые.
Часто разумнее начать с хорошо структурированного монолита (modular monolith), а потом выделять самые “проблемные” части в микросервисы.
Микросервисы дают:
независимые деплои,
гибкое масштабирование,
лучшую изоляцию доменов и команд,
но вносят:
сложность в инфраструктуру,
проблемы распределённых систем,
повышенные требования к DevOps и наблюдаемости.
Их стоит применять, когда масштаб системы и команды оправдывает эти дополнительные сложности.