পাঠ্যক্রম খুলুন
অগ্রসর পর্যায়

Domain Boundary: bounded context ও data ownership

Domain Boundaries and Bounded Contexts

এই পাঠের কুইজ ↓৫ মিনিট পড়াPHP 8.3+ · Laravel 12
এই পাঠের সূচিপত্র

এই পাঠে যা শিখবেন

  • 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 লোড হচ্ছে…

Business ভাষা দিয়ে boundary খুঁজুন
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-এ ছড়ায় না।

php
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 দেখে বাস্তব উপযোগিতা যাচাই করুন।

আরও পড়ুন

এই পাঠের কুইজ

এই পাঠ থেকে ২টি প্রশ্ন। উত্তর দিয়ে ব্যাখ্যা দেখুন; অধ্যায়ের কুইজ আলাদাভাবে দিতে হবে।

এই পাঠের ২টি প্রশ্নের উত্তর দিন। পাস করতে দুটিই সঠিক হতে হবে।

জমা দেওয়ার পর সঠিক উত্তর ও ব্যাখ্যা দেখবেন। ফলাফল এই ব্রাউজারে সংরক্ষিত থাকবে। অনুশীলনের ফল অধ্যায় সম্পন্নের হিসাবে যোগ হয় না।

সব বিষয় মিলিয়ে অনুশীলন করুন →

অগ্রগতি এই ব্রাউজারে সংরক্ষিত থাকে। শুধু পাঠ খুললে সম্পন্ন হয় না।