Получить доступ

По какому принципу правильнее проводить границы между сервисами?

MiddleМонолит и микросервисы
Ещё спрашивают так:
  • Как разделить систему на микросервисы?
  • Что такое bounded context?
Коротко

По ограниченным контекстам (bounded context) и бизнес-возможностям: типичный сценарий должен выполняться внутри одного сервиса.

  • Не по сущностям («сервис пользователей», «сервис заказов» на все случаи) и не по слоям
  • Одно слово в разных контекстах — разные модели: «заказ» для корзины, склада и бухгалтерии
  • Одна транзакция меняет один агрегат — граница транзакции подсказывает границу сервиса

А ещё Признак ошибки: на каждое изменение — правки в нескольких сервисах и синхронные цепочки вызовов

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Ограниченный контекст — область, внутри которой термины имеют одно значение и одну модель. «Заказ» при оформлении — корзина с промокодами и доставкой, на складе — позиции с весом и местом хранения, в бухгалтерии — документ с НДС. Попытка сделать один общий класс Order для всех даёт объект с десятками полей, который меняется по любой причине и связывает всех.

Почему не по сущностям и не по слоям. «Сервис пользователей», к которому ходит каждый, — центральная зависимость и узкое место. Нарезка по слоям (API-сервис, сервис логики, сервис данных) превращает каждый запрос в цепочку синхронных вызовов, где отказ любого звена — отказ всего.

Критерии хорошей границы:

  • основные сценарии выполняются внутри одного сервиса;
  • сервис владеет своими данными, другим их не отдают напрямую;
  • изменения обычно затрагивают один сервис;
  • граница совпадает с зоной ответственности команды;
  • агрегат (единица согласованности, например заказ с позициями) не разрезан между сервисами — одна транзакция меняет один агрегат.

Как искать: event storming — разложить процесс на бизнес-события и найти, где меняется язык и ответственность; смотреть на частоту совместных изменений в коде.

Признаки ошибки: синхронные цепочки на каждый запрос, распределённые транзакции, «общая библиотека моделей», изменения в нескольких репозиториях ради одной фичи.

Что хотят услышать

  • Нарезка по бизнес-возможностям и ограниченным контекстам.
  • Пример одного термина в разных контекстах.
  • Почему не по сущностям и не по слоям.
  • Агрегат и граница транзакции, признаки неверной границы.

Частые ошибки

  • Сервис на каждую таблицу.
  • Общая модель предметной области на все сервисы.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓По bounded context — области, внутри которой термины предметной области значат одно и то же
  • ✗По сущностям: сервис пользователей, сервис заказов, сервис товаров
  • ✗По техническим слоям: сервис API, сервис бизнес-логики, сервис доступа к данным
  • ✗По языкам и фреймворкам, которыми владеют разработчики

Что спросят дальше

  • Что такое агрегат и почему одна транзакция меняет один агрегат?
  • Как понять, что граница проведена неверно?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем