Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас Реклама

Чим моноліт відрізняється від модульного моноліту й мікросервісів і з чого варто починати?

Моноліт - один застосунок, одна кодова база, один процес розгортання, одна база даних. Більшість Laravel-проєктів - моноліти, і це нормально.

Модульний моноліт - той самий один застосунок, але розділений на модулі з чіткими межами: кожен модуль має власні моделі, логіку й публічний інтерфейс, а інші модулі звертаються лише через цей інтерфейс (чи події), а не напряму до таблиць і класів.

app/Modules/Billing   - публічний API: BillingFacade, події InvoicePaid
app/Modules/Catalog
app/Modules/Shipping

Мікросервіси - окремі застосунки, що розгортаються незалежно, мають власні бази даних і спілкуються мережею (HTTP, черги, брокери повідомлень).

Моноліт Модульний моноліт Мікросервіси
розгортання одне одне незалежне для кожного сервісу
транзакції звичайні звичайні розподілені (саги, кінцева узгодженість)
виклики функції функції мережа (затримки, збої)
масштабування весь застосунок весь застосунок окремо кожен сервіс
операційна складність низька низька висока: моніторинг, трасування, деплой

Чому «спершу моноліт» (Мартін Фаулер, Monolith First):

  • на початку межі предметної області невідомі - неправильно розрізані мікросервіси дорого переробляти, а в моноліті це рефакторинг;
  • мікросервіси вимагають зрілої інфраструктури: CI/CD для кожного сервісу, централізовані логи, трасування, обробка мережевих збоїв;
  • більшість успішних систем на мікросервісах починалися як моноліти.

Коли мікросервіси виправдані:

  • багато команд, що заважають одна одній у спільній кодовій базі й релізах;
  • частини з дуже різними вимогами до масштабування чи технологій;
  • незалежні цикли релізів критичні для бізнесу.

Модульний моноліт - найкращий компроміс для більшості зростаючих проєктів: чіткі межі, як у мікросервісах, без мережевих і операційних витрат. Якщо колись знадобиться виділити модуль у сервіс, межі вже готові.

Розподілений моноліт - найгірший варіант: сервіси, які мусять розгортатися разом, викликають одне одного синхронно ланцюжками й ділять базу. Ціна мікросервісів без їхніх переваг.

Докладніше в документації: Martin Fowler: Monolith First

Схожі питання