Декомпозиция сервисов и database per service
↑ 8.3 Микросервисы и распределённые системы · ← Предыдущая · → Следующая
Зачем это на собесе
Как резать систему на сервисы и что делать с данными.
Объяснение
Способы декомпозиции:
| Подход | Идея |
|---|---|
| По бизнес-возможностям (capability) | «Заказы», «Платежи», «Каталог» |
| По поддоменам DDD | bounded contexts |
| По транзакционной границе | данные, меняемые вместе, живут вместе |
| Strangler Fig | постепенное вытеснение монолита |
Критерии хорошей границы: высокая внутренняя связность, слабая внешняя, независимый релиз, одна команда-владелец, минимальная синхронная зависимость.
Database per service: каждая служба владеет своей БД/схемой; доступ к данным другого сервиса — только через его API/события.
| Вопрос | Решение |
|---|---|
| JOIN между сервисами | композиция в BFF/gateway, копия нужных данных (read-модель по событиям), API-запрос |
| Транзакция между сервисами | сага (см. Распределённые транзакции: Saga (оркестрация и хореография), 2PC) |
| Отчёты по всем данным | аналитическое хранилище (ClickHouse) через события/CDC |
| Справочники | сервис-владелец + локальные копии по событиям |
| Ссылки между сущностями | по идентификатору, без внешних ключей между БД |
Orders DB Billing DB Catalog DB
orders invoices products
↑ события OrderCreated → Billing создаёт invoice; Catalog публикует ProductChanged → Orders обновляет локальную копию названияНюансы и подводные камни
- Слишком мелкие сервисы (nano-services) — избыточная сетевая связность.
- Общая таблица «на всех» возвращает сильную связанность.
- Дублирование данных допустимо, но нужен владелец и способ синхронизации.
- Миграция данных из монолитной БД — самая сложная часть.
- Кросс-сервисные отчёты и поиск требуют отдельного решения.
Практика
- Определите по домену 3–4 сервиса и владельца каждой сущности.
- Опишите, как сервис «Заказы» получает название товара без JOIN.
- Спланируйте выделение сервиса из монолита по Strangler Fig.
Вопросы с ответами
Что такое database per service?
Каждый сервис владеет своими данными, доступ извне только через API/события.
Как получить данные из нескольких сервисов в одном ответе?
API composition в шлюзе/BFF или локальные read-модели, обновляемые событиями.