Domain Boundary: bounded context ও data ownership
Domain Boundaries and Bounded Contexts
এই পাঠের সূচিপত্র
এই পাঠে যা শিখবেন
- Business ভাষা দিয়ে boundary খুঁজুন
- Bounded context ও data ownership বুঝুন
- Integration contract-এ অর্থ স্পষ্ট করুন
সমস্যা দিয়ে শুরু
একই Product model pricing, warehouse ও search সব team বদলায়। Warehouse-এর “available” মানে physically present, storefront-এর অর্থ sellable after reservation। একটি shared status field বদলালে অন্য team-এর logic ভাঙছে। একই শব্দ সব context-এ একই অর্থ নয়।
সহজ করে বুঝি
Bounded context একটি model ও ভাষার সীমা যেখানে term-এর অর্থ পরিষ্কার। Domain boundary business capability ও invariant অনুসরণ করে; শুধু database entity নয়। Context আলাদা হলেও application deployment এক হতে পারে। Integration-এ explicit contract এবং প্রয়োজনে anti-corruption layer বাইরের model translate করে।
পরিচিত একটি উপমা
হাসপাতালের reception-এ “admitted” মানে paperwork complete, ward-এ মানে bed assigned হতে পারে। একই শব্দে দুই কাজ চালালে ভুল হয়। Department নিজের register রাখে এবং transfer form-এ অর্থ স্পষ্ট করে, অন্যের register-এর column অনুমান করে না।
নকশাটি দেখুন
Diagram লোড হচ্ছে…
Diagram-এর text flow দেখুন
flowchart LR P[Pricing Context] -->|Published price quote| O[Ordering Context] I[Inventory Context] -->|Reservation result| O O -->|Order summary| S[Search Context] S --> R[(Search Projection)]
Pricing final quote-এর contract দেয়। Inventory reservation result বলে; raw stock table প্রকাশ করতে হয় না। Ordering নিজের order lifecycle-এর owner। Search derived summary রাখে, কিন্তু সেই projection দেখে authoritative reservation দেয় না। Arrow প্রতিটি context-এর public ভাষা।
PHP ও Laravel-এ প্রয়োগ
Laravel adapter fragment-এ warehouse response নিজের application DTO-তে translate করা হচ্ছে। ExternalStockClient এখানে app-defined interface; trusted endpoint, timeout ও schema validation adapter-এর দায়িত্ব। Consumer সরাসরি supplier-এর raw array সব controller-এ ছড়ায় না।
final readonly class StockAvailability
{
public function __construct(
public int $sellableQuantity,
public string $warehouseReference,
) {}
}
function mapWarehouseReply(array $payload): StockAvailability
{
$physical = max(0, (int) $payload['physical_count']);
$reserved = max(0, (int) $payload['reserved_count']);
return new StockAvailability(
sellableQuantity: max(0, $physical - $reserved),
warehouseReference: (string) $payload['location_code'],
);
}
// Validate the supplier schema before mapping; this is only translation.এটি PHP 8.3+ ও Laravel 12-এর শিক্ষামূলক fragment; সম্পূর্ণ application নয়। সংশ্লিষ্ট route-এ authentication ও resource authorization প্রয়োগ করতে হবে। নিচের অনুশীলনে failure ইচ্ছা করে তৈরি করুন; শুধু সফল response দেখে correctness ধরে নেবেন না।
সুবিধা, সীমাবদ্ধতা ও trade-off
Clear boundary team autonomy ও model clarity দেয়। Data duplication ও integration contracts বাড়ে। অত্যন্ত chatty context split network calls ও consistency problems সৃষ্টি করে; একই invariant-এর data সাধারণত এক owner-এর কাছাকাছি রাখা সহজ।
সাধারণ ভুল
- প্রতি table-কে microservice বানানো।
- এক shared model package দিয়ে সব context-এর semantics বেঁধে ফেলা।
- Search copy-কে inventory-এর source of truth করা।
আরও একটু গভীরে
Context mapping customer-supplier, shared kernel বা anti-corruption layer-এর মতো সম্পর্ক দেখায়। Event storming business ঘটনার ধারায় boundary খুঁজতে সাহায্য করতে পারে। Boundary organizational convenience-এর পাশাপাশি transaction এবং change frequency দিয়ে যাচাই করুন।
Product-এর দশ field-এর owner তালিকা করুন। Price, warehouse quantity ও search ranking আলাদা অর্থ বহন করে। কোন field immutable snapshot হিসেবে order-এ রাখতে হবে তা ঠিক করুন, যাতে ভবিষ্যতে product name বা price বদলালেও invoice history বদলে না যায়।
মনে রাখুন
- শব্দের অর্থ context-এর ভিতরে নির্দিষ্ট।
- Data owner প্রকাশ্য করুন।
- Contract দিয়ে translate করুন।
নিজে চেষ্টা করুন
Order, payment ও fulfillment context-এ “completed” শব্দের তিনটি সংজ্ঞা লিখুন। একটি status field share করলে কোন ভুল হবে দেখান।
নিজের বোঝা যাচাই করুন
1. Context মানেই service?
না। একই deployable application-এর মধ্যে bounded modules হিসেবেও থাকতে পারে।
2. এক Product model কেন সমস্যা?
বিভিন্ন business ভাষা ও invariant জোর করে এক schema-এ ঢুকলে change coupling বাড়ে।
3. Anti-corruption layer কী?
বাইরের model নিজের domain ভাষায় translate করে; external semantics ছড়ানো কমায়।
4. Data duplicate চলবে?
Derived copy বা historical snapshot হতে পারে, তবে authoritative owner ও freshness স্পষ্ট চাই।
5. Boundary পরীক্ষা?
Common transactions, change patterns এবং cross-boundary chatty calls দেখে বাস্তব উপযোগিতা যাচাই করুন।
আরও পড়ুন
এই পাঠের কুইজ
এই পাঠ থেকে ২টি প্রশ্ন। উত্তর দিয়ে ব্যাখ্যা দেখুন; অধ্যায়ের কুইজ আলাদাভাবে দিতে হবে।
এই পাঠের ২টি প্রশ্নের উত্তর দিন। পাস করতে দুটিই সঠিক হতে হবে।
জমা দেওয়ার পর সঠিক উত্তর ও ব্যাখ্যা দেখবেন। ফলাফল এই ব্রাউজারে সংরক্ষিত থাকবে। অনুশীলনের ফল অধ্যায় সম্পন্নের হিসাবে যোগ হয় না।
অগ্রগতি এই ব্রাউজারে সংরক্ষিত থাকে। শুধু পাঠ খুললে সম্পন্ন হয় না।