По какому принципу правильнее проводить границы между сервисами?
- Как разделить систему на микросервисы?
- Что такое bounded context?
По ограниченным контекстам (bounded context) и бизнес-возможностям: типичный сценарий должен выполняться внутри одного сервиса.
- Не по сущностям («сервис пользователей», «сервис заказов» на все случаи) и не по слоям
- Одно слово в разных контекстах — разные модели: «заказ» для корзины, склада и бухгалтерии
- Одна транзакция меняет один агрегат — граница транзакции подсказывает границу сервиса
А ещё Признак ошибки: на каждое изменение — правки в нескольких сервисах и синхронные цепочки вызовов
Подробно
Ограниченный контекст — область, внутри которой термины имеют одно значение и одну модель. «Заказ» при оформлении — корзина с промокодами и доставкой, на складе — позиции с весом и местом хранения, в бухгалтерии — документ с НДС. Попытка сделать один общий класс Order для всех даёт объект с десятками полей, который меняется по любой причине и связывает всех.
Почему не по сущностям и не по слоям. «Сервис пользователей», к которому ходит каждый, — центральная зависимость и узкое место. Нарезка по слоям (API-сервис, сервис логики, сервис данных) превращает каждый запрос в цепочку синхронных вызовов, где отказ любого звена — отказ всего.
Критерии хорошей границы:
- основные сценарии выполняются внутри одного сервиса;
- сервис владеет своими данными, другим их не отдают напрямую;
- изменения обычно затрагивают один сервис;
- граница совпадает с зоной ответственности команды;
- агрегат (единица согласованности, например заказ с позициями) не разрезан между сервисами — одна транзакция меняет один агрегат.
Как искать: event storming — разложить процесс на бизнес-события и найти, где меняется язык и ответственность; смотреть на частоту совместных изменений в коде.
Признаки ошибки: синхронные цепочки на каждый запрос, распределённые транзакции, «общая библиотека моделей», изменения в нескольких репозиториях ради одной фичи.
Что хотят услышать
- Нарезка по бизнес-возможностям и ограниченным контекстам.
- Пример одного термина в разных контекстах.
- Почему не по сущностям и не по слоям.
- Агрегат и граница транзакции, признаки неверной границы.
Частые ошибки
- Сервис на каждую таблицу.
- Общая модель предметной области на все сервисы.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗По сущностям: сервис пользователей, сервис заказов, сервис товаров
- ✗По языкам и фреймворкам, которыми владеют разработчики
- ✓По bounded context — области с единым смыслом терминов предметной области
- ✗По техническим слоям: отдельные сервисы для API, бизнес-логики и доступа к данным
Что спросят дальше
- Что такое агрегат и почему одна транзакция меняет один агрегат?
- Как понять, что граница проведена неверно?
Разбор темы
- Монолит, микросервисы и границы сервисов
Когда микросервисы оправданы, а когда вредны; bounded context и DDD как способ резать систему; распределённый монолит и его признаки; база на сервис и организационная цена.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.