Что такое Bounded Context и как он связан с микросервисами?
Bounded Context (ограниченный контекст) — это центральная концепция Domain-Driven Design, обозначающая границу, внутри которой определённая модель предметной области является согласованной и единообразной.
Аналогия из жизни: в разных отделах банка слово «клиент» означает разное. Для отдела продаж — это лид с контактами, для кредитного — заёмщик со скоринговым баллом, для платёжного — владелец счёта. Каждый отдел — это свой Bounded Context.
В разных контекстах одно и то же понятие может иметь разное значение. Например, «Клиент» в банковской системе:
- В контексте продаж — это лид с контактными данными и историей взаимодействий.
- В контексте кредитования — это заёмщик с кредитной историей и скоринговым баллом.
- В контексте платежей — это владелец счёта с реквизитами.
Каждый контекст имеет свою модель «Клиента», и это нормально. Попытка создать единую модель для всех контекстов приводит к «Большому комку грязи» (Big Ball of Mud).
Связь с микросервисами: один Bounded Context, как правило, соответствует одному микросервису (или группе тесно связанных сервисов).
Пример кода: разные модели клиента в разных контекстах
// Контекст "Платежи" — своя модель клиента
package com.bank.payment.domain;
public class PaymentCustomer {
private Long id;
private String accountNumber;
private BigDecimal balance;
// Здесь нет данных о кредитной истории — они не нужны
}
// Контекст "Кредитование" — своя модель клиента
package com.bank.credit.domain;
public class CreditCustomer {
private Long id;
private CreditScore creditScore;
private List<CreditHistory> history;
// Здесь нет данных о балансе счёта
}
Context Map
Context Map — диаграмма, показывающая взаимосвязи между контекстами:
- Shared Kernel — общий код между контекстами (минимизировать!).
- Customer-Supplier — один контекст является потребителем данных другого.
- Anti-Corruption Layer (ACL) — слой адаптации между контекстами, предотвращающий загрязнение модели чужими концепциями.
- Published Language — формальный язык обмена данными (например, события в Kafka).
На собеседовании: связка «Bounded Context = микросервис» — это ключевой инсайт. Также упомяните Anti-Corruption Layer — он показывает, что вы понимаете, как защитить свою модель от чужих абстракций.