Определяет ли ограниченный контекст границы сервиса

Компонент — это упаковка агрегатов; ограниченный контекст — это понятие единого языка (Ubiquitous Language).

В разговорах о микросервисной архитектуре часто можно услышать, что границы сервиса должны совпадать с границами ограниченного контекста (Bounded Context)[*]. Такой подход удобен, однако не является аксиомой: компонент (а сервис — частный случай компонента) и ограниченный контекст — понятия разной природы, поэтому их границы могут совпадать, а могут и расходиться.

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

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


[*] См., например: Newman S. Building Microservices. O’Reilly Media, 2015. Гл. 3 «How to Model Services», разд. «The Bounded Context».