1. Введение в микросервисы: границы сервисов и ответственность
Введение в микросервисы: границы сервисов и ответственность
Микросервисная архитектура — это подход, в котором система состоит из набора небольших сервисов, каждый из которых реализует отдельную бизнес-возможность, владеет своими данными и может разворачиваться независимо. Ключевая сложность здесь не в количестве сервисов, а в том, как провести границы и распределить ответственность, чтобы система не превратилась в «распределённый монолит».
Что такое «граница сервиса»
Граница сервиса — это договорённость, что находится внутри (логика, данные, правила) и что находится снаружи (контракты, события, API). Хорошая граница снижает количество причин для изменений и уменьшает связность.
Практичная формулировка:
Визуализация идеи границ
Ответственность сервиса: что обязательно определить
1) Бизнес-ответственность (что сервис делает)
Ответственность должна быть сформулирована как результат для бизнеса, а не как набор CRUD-операций.Примеры удачных формулировок:
Пример слабой формулировки:
2) Владение данными (что сервис контролирует)
В микросервисах правило простое: у каждой сущности должен быть один владелец. Другие сервисы не должны напрямую писать в «чужую» базу.Что это даёт:
Компромисс: другим сервисам могут быть нужны данные «чужой» сущности. Тогда используются:
3) Контракты взаимодействия (как сервис общается)
Контракт — это обещание сервиса внешнему миру. Он должен быть стабильнее внутренней реализации.Типовые формы:
Важно: контракт описывает что доступно, но не раскрывает как внутри устроено.
Как проводить границы: рабочие эвристики
Эвристика 1: «Сначала бизнес, потом техника»
Границы лучше определять по бизнес-процессам и правилам, а не по слоям приложения (UI/DAO/Service) и не по технологическим компонентам.Эвристика 2: Bounded Context (ограниченный контекст)
Один и тот же термин может означать разное в разных частях бизнеса.Пример: «Клиент»
Если значения различаются, это сигнал к разным контекстам и потенциально разным сервисам.
Эвристика 3: Изменяемость как главный индикатор
Сгруппируйте вместе то, что меняется по одной причине. Если часть функциональности меняется независимо и часто конфликтует с другими изменениями — возможно, граница проведена неверно.Эвристика 4: «Один сервис — один владелец данных»
Если два сервиса должны совместно обновлять одну таблицу — это почти всегда плохой знак. Либо данные нужно разделить, либо выбрать владельца и перенести ответственность.Типичные ошибки при выделении сервисов
Мини-чеклист хорошей границы
---
Задания для закрепления
1) Разделение на сервисы. Есть интернет-магазин: каталог товаров, корзина, оформление заказа, оплата, доставка, поддержка. Предложите 4–6 сервисов и сформулируйте ответственность каждого.
2) Владение данными. Для сущностей Order, Payment, Shipment, CustomerProfile укажите владельца-сервис и способ получения данных другими сервисами (API или события).
3) Поиск ошибок границ. Ситуация: сервис «Заказы» пишет в таблицу платежей, потому что «так проще». Какие риски и как исправить?
4) Сигналы “распределённого монолита”. Назовите 3 признака, что сервисы выделены формально, но автономности нет.
<details> <summary> Ответы </summary>
1) Пример разбиения:
2) Владение и доступ:
Order — владелец Заказы; другим: события OrderCreated/OrderCancelled и/или API чтения.Payment — владелец Оплата; другим: события PaymentSucceeded/PaymentFailed.Shipment — владелец Доставка; другим: события ShipmentCreated/ShipmentDelivered.CustomerProfile — владелец Профиль/Клиенты (если выделен) или Поддержка (если профиль тесно связан с обращениями); другим: API чтения + события об изменениях профиля.3) Риски и исправление:
Риски:
Исправление:
Payment;4) Признаки распределённого монолита:
</details>