Монолит

Оригинальное название: monolith

Коротко

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

Что такое «Монолит»

Так устроено большинство сайтов и веб-приложений. WordPress с темой и плагинами, 1С-Битрикс с модулями, типичный проект на Laravel или Django — монолиты: один код, один процесс выпуска, одна база. Вызов между частями — обычный вызов функции внутри процесса, без сети и сериализации. Слово часто звучит как упрёк, особенно на фоне разговоров про микросервисы, но само по себе ничего плохого не означает.

Монолит — не значит плохо

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

Мартин Фаулер в заметке «MonolithFirst» советует начинать новые системы именно с монолита: пока предметная область не изучена, границы между сервисами почти наверняка будут проведены неправильно.

Пример: магазин на одной CMS

Интернет-магазин на 1С-Битриксе включает каталог, корзину, оплату, личный кабинет, обмен с 1С и рассылки. Всё это модули одного приложения с общей базой. Выпуск — обновление файлов и применение миграций. Проблемы начинаются, когда модули переплетаются: обработчик события корзины лезет в таблицы рассылок, шаблон каталога сам считает скидки, а правка в одном месте неожиданно ломает другое. Это не вина монолита как такового, а высокая связанность модулей. Такую систему называют «большим комом грязи».

Как понять, что монолит пора делить

  • Несколько команд постоянно мешают друг другу при выпусках.
  • Одна часть требует совсем других ресурсов: например, генерация отчётов забирает память у витрины.
  • Сборка и тесты идут так долго, что выпуски откладывают.

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

Обновлено:

Все термины раздела «Backend»

Что будем искать? Например,Продвижение