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

Базовый System Design
≈ 2 мин чтения

Разделять нужно по ответственности

Декомпозиция отвечает на вопрос: какие части системы действительно могут жить относительно независимо? Полезная граница обычно проходит вокруг законченной бизнес-возможности — например, управления заказом или расчёта платежа, а не вокруг технического слоя вроде «контроллеров» или «репозиториев».

Bad split:
UI Service -> Logic Service -> Database Service

Better split:
Orders Service | Payments Service | Users Service

Во втором варианте внутри каждого сервиса остаются и API, и бизнес-правила, и работа с его данными. Изменения одной возможности реже требуют одновременно менять все остальные сервисы.

Ищем то, что меняется вместе

Хороший кандидат на отдельный сервис объединяет правила и данные, которые часто участвуют в одной задаче. Если две части почти каждое изменение делают совместно, требуют общей транзакции и постоянно запрашивают внутренние данные друг друга, их разделение, скорее всего, произошло слишком рано или по неправильной линии.

Полезно смотреть на бизнес-сценарии, ответственность команд и характер нагрузки. Разные причины могут подсказывать одну и ту же границу, но ни один формальный размер класса или таблицы не определяет её автоматически.

Начинать лучше с крупных частей

Крупную границу проще позже разделить ещё раз, чем постоянно поддерживать десятки чрезмерно мелких сервисов. На раннем этапе важнее снизить количество межсервисных зависимостей и сохранить внутри сервиса связную модель.

Количество сервисов не является метрикой качества. Цель декомпозиции — независимость изменений, а не максимальное число процессов.