Ответ
Монолитная архитектура
- Плюсы:
- Простота разработки: Единая кодовая база, простой запуск, отладка и тестирование (можно запустить всё локально).
- Простота развертывания: Один артефакт (WAR/JAR, исполняемый файл) для деплоя.
- Производительность: Вызовы между компонентами — это обычные вызовы методов в памяти, нет сетевых задержек и накладных расходов на сериализацию.
- Согласованность данных: Использование транзакций ACID в рамках одной базы данных.
- Минусы:
- Сложность масштабирования: Можно масштабировать только весь монолит целиком («вертикально» или запуская несколько одинаковых копий), а не отдельные нагруженные модули.
- Технологический стек: Привязанность к одному стеку технологий для всего приложения.
- Надежность: Баг в одном модуле может «повалить» всё приложение.
- Эволюция: По мере роста кодовая база становится громоздкой, замедляется разработка и онбординг новых разработчиков.
Микросервисная архитектура
- Плюсы:
- Независимое масштабирование: Каждый сервис можно масштабировать независимо в зависимости от его нагрузки.
- Независимое развертывание: Сервисы можно разрабатывать, тестировать и деплоить независимо друг от друга, что ускоряет delivery.
- Гетерогенность технологий: Разные сервисы можно писать на разных языках и использовать разные БД, выбирая оптимальный инструмент для задачи.
- Отказоустойчивость: Падение одного сервиса не обязательно приводит к падению всей системы (при правильной реализации отказоустойчивости).
- Организация команд: Позволяет строить автономные команды вокруг сервисов (Conway's Law).
- Минусы:
- Сложность распределенной системы: Появляются проблемы сетевых задержек, частичных отказов, необходимости idempotency, трассировки запросов, согласованности данных (часто eventual consistency).
- Операционные накладные расходы: Требуется инфраструктура для оркестрации (Kubernetes), мониторинга, логирования, service discovery, API Gateway.
- Сложность отладки и тестирования: Для отладки цепочки вызовов нужны распределенные трейсеры, а для тестирования — развертывание целого стека или моки.
Итог: Нет «серебряной пули». Начинать почти всегда стоит с монолита (или модульного монолита). Переход на микросервисы оправдан при реальной необходимости в независимом масштабировании компонентов, разных темпах изменений в разных частях системы или при работе нескольких крупных независимых команд.