Каковы ключевые характеристики, преимущества и недостатки монолитной архитектуры?

«Каковы ключевые характеристики, преимущества и недостатки монолитной архитектуры?» — вопрос из категории Архитектура, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Монолитная архитектура — это стиль, при котором все компоненты приложения (UI, бизнес-логика, доступ к данным) упакованы в единую deployable единицу (WAR/JAR) и работают в одном процессе.

Характеристики:

  • Единая кодовая база и процесс сборки.
  • Компоненты вызывают друг друга через прямые вызовы методов (в памяти).
  • Общие библиотеки и модели данных.
  • Развёртывается как одно целое.

Пример структуры Spring Boot монолита:

src/main/java/com.example.app/
├── Application.java          # Главный класс с @SpringBootApplication
├── controller/              # REST-контроллеры (@RestController)
├── service/                 # Бизнес-логика (@Service)
├── repository/              # Доступ к данным (@Repository)
└── model/                   # Сущности JPA (@Entity)

Преимущества:

  • Простота разработки и отладки: Запуск одного приложения, трассировка вызовов в одном процессе.
  • Простота развёртывания: Нужно скопировать и запустить один артефакт.
  • Согласованность транзакций: Легко обеспечить ACID через @Transactional, так как всё работает с одной БД.
  • Меньше накладных расходов: Нет сетевых задержек на межсервисное взаимодействие (RPC/HTTP).

Недостатки:

  • Сложность масштабирования: Можно масштабировать только целиком («горизонтально клонировать» весь монолит), а не отдельные нагруженные компоненты.
  • Технологическая связанность: Сложно внедрить новые технологии (например, другой язык) для части функционала.
  • Надёжность: Падение одного компонента может привести к падению всего приложения.
  • Непрерывная интеграция: По мере роста кодовой базы полная сборка и прогон всех тестов становятся очень долгими.
  • Понимание кода: Новичкам сложно разобраться в большой единой кодовой базе.

Когда выбирать: Для небольших проектов, команд или на старте продукта, когда важна скорость выхода на рынок и простота операций.