Архітектурний стиль

Модульний моноліт

Один деплой, але всередині чіткі модулі з власними даними й публічним API. Дає порядок мікросервісів без їхньої мережевої ціни.

Модульний моноліт: один процес, модулі з власними схемами данихпублічне APIКлієнтиHTTP-шарМодуль курсівМодуль оплатМодуль юзерівСхема coursesСхема billingСхема users
Модульний моноліт: один процес, модулі з власними схемами даних

Ідея

Модульний моноліт ділить код на модулі за бізнес-доменами: 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.

Інструменти

Джерела

Логотипи належать їхнім власникам і використані лише для ідентифікації. Іконки: Simple Icons (CC0), Devicon (MIT).

Розділи платформи