Архитектура микросервисов
Разделение одного крупного Node-приложения на маленькие, независимо развёртываемые сервисы
- объяснить, что такое граница сервиса и как её найти (ограниченные контексты, а не слои);
- выбирать между синхронной (запрос/ответ) и асинхронной (событие/сообщение) коммуникацией;
- применять правило «база данных на сервис» и понимать, почему общая база ломает микросервисы;
- честно взвешивать компромиссы микросервисов против хорошо построенного монолита;
- распознавать, когда монолит - верный ответ, а микросервисы преждевременны.
1. От монолита к сервисам
Монолит - это одна развёртываемая единица. В мире Node это единое Express-приложение: маршрутизация, бизнес-логика и доступ к базе данных живут в одном процессе и выкатываются вместе. Это вполне хорошая архитектура - её просто запускать, легко отлаживать по одному стеку вызовов, а транзакция базы данных может охватывать весь домен. Большинству систем стоит начинать именно отсюда.
Монолит становится болезненным, когда единая кодовая база и единое развёртывание начинают мешать команде: один медленный модуль заставляет масштабировать всё приложение, одно рискованное изменение блокирует каждый другой релиз, а растущая команда постоянно сталкивается в одних и тех же файлах. Микросервисы отвечают на это организационное и масштабное давление, разделяя приложение по бизнес-возможностям - orders, payments, inventory, notifications - каждая из которых работает как отдельный Node-процесс, развёртывается по своему графику и масштабируется по своим метрикам.
Аналогия. Монолит - это одна большая кухня ресторана, где все повара делят один набор столов, один холодильник и один блокнот заказов. Это эффективно, пока команда маленькая. Микросервисы - как фуд-корт: у каждого прилавка (гриль, суши, пекарня) свой стол, свой холодильник, свой персонал, и он может открыться, закрыться или расшириться, не останавливая остальные. Координация теперь идёт через «билеты», передаваемые между прилавками, а не через крик через один зал - больше подвижных частей, но каждый прилавок масштабируется и отказывает сам по себе.
Ключевой сдвиг в мышлении: микросервисы - это меньше технический паттерн и больше организационный. Их принимают, чтобы независимые команды могли независимо разрабатывать, развёртывать и масштабировать. Если такого давления нет, лишняя машинерия - это чистые издержки.