Архітектурний стиль
Модульний моноліт
Один деплой, але всередині чіткі модулі з власними даними й публічним API. Дає порядок мікросервісів без їхньої мережевої ціни.
Ідея
Модульний моноліт ділить код на модулі за бізнес-доменами: courses, billing, users, notifications. Кожен модуль має внутрішній код, до якого ніхто не лізе, і невелике публічне API, через яке з ним говорять інші.
Деплоїться все разом, як звичайний моноліт. Різниця в правилах: модуль billing не робить SELECT з таблиць courses, а викликає courses.getPrice(courseId).
Як тримати межі
Межі мають перевірятися автоматично, інакше вони зникнуть за пів року. У Ruby для цього є Packwerk від Shopify, у Java ArchUnit або Spring Modulith, у TypeScript правило ESLint no-restricted-imports чи dependency-cruiser.
Дані теж діляться: окрема схема PostgreSQL на модуль (courses.*, billing.*) і заборона крос-схемних join. Звіти, яким потрібні дані кількох модулів, будуються з окремої read-моделі або через API модулів.
Модулі можуть спілкуватися подіями всередині процесу: billing публікує PaymentSucceeded, а courses відкриває доступ до курсу. Пізніше цю шину легко замінити на Kafka чи RabbitMQ, якщо модуль виїде в окремий сервіс.
Шлях до сервісів
Добре відокремлений модуль виносити в сервіс дешево: його API вже є, його дані вже окремо, залежностей мало. Тому модульний моноліт часто називають найкращим стартом для майбутніх мікросервісів.
Але багато команд так і не роблять цей крок, бо модульний моноліт закриває головну проблему (команди не заважають одна одній) без нової інфраструктури. Shopify обрав саме цей шлях для свого Rails-кодбейсу з мільйонами рядків.
Плюси
- Простота деплою моноліту плюс зрозумілі межі між доменами.
- Команди володіють модулями й менше конфліктують.
- Виклики між модулями без мережі, транзакції можливі там, де дійсно потрібні.
- Модуль можна винести в сервіс пізніше, коли з'явиться реальна причина.
Мінуси
- Потрібна дисципліна й інструменти для перевірки меж.
- Деплой і рантайм усе одно спільні: один модуль може покласти всіх.
- Правильно провести межі на старті важко, їх доведеться переносити.
Коли обирати
- Продукт росте, команда вже 10...40 людей, але мікросервіси здаються передчасними.
- Домен має очевидні підобласті (каталог, оплати, навчання).
- Хочете залишити собі дешевий шлях до сервісів у майбутньому.
Де застосовують
- Shopify: модуляризація великого Rails-моноліту на компоненти з перевіркою меж через Packwerk.
Інструменти
- Ruby on RailsПовноцінний Ruby-фреймворк, що популяризував конвенції замість конфігурації та Active Record.
- Spring BootНадбудова над Spring для Java і Kotlin, що дає автоналаштування й запуск застосунку однією командою.
- NestJSПрогресивний Node.js-фреймворк на TypeScript з модулями, декораторами та впровадженням залежностей.
- .NETКросплатформна платформа від Microsoft для C#, з ASP.NET Core для вебу й API.
- PostgreSQLПотужна open source реляційна база даних з розширеннями, JSONB, повнотекстовим пошуком і сильною підтримкою SQL.
Пов'язані теми
Джерела
Логотипи належать їхнім власникам і використані лише для ідентифікації. Іконки: Simple Icons (CC0), Devicon (MIT).