Моноліт - один застосунок, одна кодова база, один процес розгортання, одна база даних. Більшість Laravel-проєктів - моноліти, і це нормально.
Модульний моноліт - той самий один застосунок, але розділений на модулі з чіткими межами: кожен модуль має власні моделі, логіку й публічний інтерфейс, а інші модулі звертаються лише через цей інтерфейс (чи події), а не напряму до таблиць і класів.
app/Modules/Billing - публічний API: BillingFacade, події InvoicePaid
app/Modules/Catalog
app/Modules/Shipping
Мікросервіси - окремі застосунки, що розгортаються незалежно, мають власні бази даних і спілкуються мережею (HTTP, черги, брокери повідомлень).
| Моноліт | Модульний моноліт | Мікросервіси | |
|---|---|---|---|
| розгортання | одне | одне | незалежне для кожного сервісу |
| транзакції | звичайні | звичайні | розподілені (саги, кінцева узгодженість) |
| виклики | функції | функції | мережа (затримки, збої) |
| масштабування | весь застосунок | весь застосунок | окремо кожен сервіс |
| операційна складність | низька | низька | висока: моніторинг, трасування, деплой |
Чому «спершу моноліт» (Мартін Фаулер, Monolith First):
- на початку межі предметної області невідомі - неправильно розрізані мікросервіси дорого переробляти, а в моноліті це рефакторинг;
- мікросервіси вимагають зрілої інфраструктури: CI/CD для кожного сервісу, централізовані логи, трасування, обробка мережевих збоїв;
- більшість успішних систем на мікросервісах починалися як моноліти.
Коли мікросервіси виправдані:
- багато команд, що заважають одна одній у спільній кодовій базі й релізах;
- частини з дуже різними вимогами до масштабування чи технологій;
- незалежні цикли релізів критичні для бізнесу.
Модульний моноліт - найкращий компроміс для більшості зростаючих проєктів: чіткі межі, як у мікросервісах, без мережевих і операційних витрат. Якщо колись знадобиться виділити модуль у сервіс, межі вже готові.
Розподілений моноліт - найгірший варіант: сервіси, які мусять розгортатися разом, викликають одне одного синхронно ланцюжками й ділять базу. Ціна мікросервісів без їхніх переваг.