Монолит

Базовый System Design
≈ 2 мин чтения

Одно приложение как единое целое

В монолите основные части продукта находятся в одном приложении и обычно проходят общий жизненный цикл: собираются, тестируются и развёртываются вместе. Внутри могут быть контроллеры, бизнес-логика, работа с данными и десятки функциональных областей, но снаружи это один запускаемый компонент.

Client -> Monolith -> Database
          |-- users
          |-- orders
          |-- payments

Это не означает, что код обязательно смешан в одну кучу. Монолит вполне может иметь аккуратные пакеты, модули и зависимости. Его определяет прежде всего единая граница развёртывания, а не отсутствие структуры внутри.

Почему монолит удобен на старте

Один процесс проще запускать локально, тестировать и наблюдать. Вызовы между частями приложения обычные локальные вызовы, а изменения данных часто можно выполнить в одной транзакции. Команде не нужно сразу решать вопросы сетевых сбоев, межсервисной совместимости и координации нескольких развёртываний.

Пока продукт и команда не стали слишком большими, такая простота часто важнее независимого масштабирования каждой функции. Изменение, которое затрагивает несколько частей системы, можно реализовать и выпустить одним согласованным обновлением.

Где начинают появляться ограничения

По мере роста приложения общая граница развёртывания становится теснее. Маленькое изменение требует пересобрать и выпустить весь продукт, разные команды чаще затрагивают один и тот же код, а масштабировать приходится весь процесс даже тогда, когда нагрузка растёт только на одну функцию.

Монолит не равен плохой архитектуре. Проблема начинается не из-за одного процесса, а когда внутри него нет понятных границ и любое изменение затрагивает всё вокруг.