Декомпозиция сервисов и database per service

↑ 8.3 Микросервисы и распределённые системы · ← Предыдущая · → Следующая

Желательно~3 мин чтенияУровень: senior

Зачем это на собесе

Как резать систему на сервисы и что делать с данными.

Объяснение

Способы декомпозиции:

ПодходИдея
По бизнес-возможностям (capability)«Заказы», «Платежи», «Каталог»
По поддоменам DDDbounded 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) — избыточная сетевая связность.
  • Общая таблица «на всех» возвращает сильную связанность.
  • Дублирование данных допустимо, но нужен владелец и способ синхронизации.
  • Миграция данных из монолитной БД — самая сложная часть.
  • Кросс-сервисные отчёты и поиск требуют отдельного решения.

Практика

  1. Определите по домену 3–4 сервиса и владельца каждой сущности.
  2. Опишите, как сервис «Заказы» получает название товара без JOIN.
  3. Спланируйте выделение сервиса из монолита по Strangler Fig.

Вопросы с ответами

Связанные темы