پیشزمینه:
شرکت شما(https://MyTrip.Com) به عنوان یک ارائهدهنده خدمات مسافرتی، امکان رزرو بلیت پرواز و هتل را به مشتریان خود میدهد. این خدمات توسط دو تیم مجزا و از طریق دو سرویس مستقل (پرواز و هتل) ارائه میشوند.
سناریو:

تصور کنید مشتری به نام “تقی” قصد دارد سفری را برنامهریزی کند. او ابتدا از طریق وبسایت شما، بلیت پروازی را نقی، به مقصد استانبول خریداری میکند. چند هفته بعد، تقی تصمیم میگیرد سفری خانوادگی به کیش داشته باشد. این بار، او برای خود، نقی و شهین و مهین، اتاقی را در یک هتل رزرو میکند.
در این سناریو:
- خریدار: تقی، که مسئول پرداخت هزینه بلیت پرواز و رزرو هتل است.
- مسافر: تقی، که از بلیت پرواز خریداری شده نقی استفاده میکند.
- مهمان: نقی و شهین و مهین، که در هتل اقامت میکنند.
همانطور که مشاهده میکنید، در این مثال، خریدار، مسافر و مهمان میتوانند افراد مختلفی باشند. این موضوع پیچیدگیهای جدیدی را در مدلسازی و مدیریت اطلاعات مشتریان به وجود میآورد.
با توجه به این سناریو، چالش اصلی این است که چگونه میتوان این سه نقش را در سیستم مدیریت کرد، به گونهای که:
- اطلاعات خریدار (تقی) به درستی ثبت و مدیریت شود.
- اطلاعات مسافر (نقی) و مهمانان (نقی و شهین و مهین) نیز به طور جداگانه و دقیق ثبت شود.
- ارتباط بین این سه نقش به درستی برقرار شود، تا در صورت نیاز، بتوان اطلاعات مربوط به یک سفر یا مشتری را به طور کامل مشاهده کرد.
- اطلاعات به شکلی ذخیره شود که حریم خصوصی افراد حفظ شود.
صورت مسئله:
با توجه به مستقل بودن سرویسهای پرواز و هتل، و با در نظر گرفتن تفاوت بین خریدار، مسافر و مهمان، به سوالات زیر پاسخ دهید:
مدلسازی (DDD) و طراحی محصول:
- با استفاده از مفاهیم DDD، چگونه موجودیتهای “خریدار”، “مسافر” و “مهمان” را مدل میکنید؟ چه Value Object و Aggregateهایی را شناسایی میکنید و چرا؟
- چگونه میتوانید یک “شناسه مشتری یکتا” را برای “خریدار” در سطح کل سیستم ایجاد و مدیریت کنید؟ مزایا و معایب رویکردهای مختلف را شرح دهید.
- چگونه ارتباط بین “خریدار”، “مسافر” و “مهمان” را مدل میکنید؟ چه الگوهای طراحی را برای این ارتباط پیشنهاد میکنید؟
- آیا سناریوی بالا را در یک Bounded Context جداگانه مدل میکنید؟ دلایل خود را شرح دهید.
- در صورتی که یک Bounded Context جداگانه برای پیادهسازی سناریوی بالا استفاده میکنید، Context Map بین این Bounded Context و سایر Bounded Contextها (مانند Booking، Customer Profile یا Notification) چگونه خواهد بود؟
- چگونه به UL (Ubiquitous Language) در طراحی موارد بالا پایبند خواهید بود؟ جواب خود را شرح دهید. نامگذاری مفاهیم دامنه را شرح دهید.
- به عنوان مدیر محصول، چه ویژگیهایی را برای مدیریت و مشاهده اطلاعات مشتریان (خریداران) و مسافران/مهمانان تعریف میکنید؟ چه گزارشها و داشبوردهایی را نیاز دارید؟
یکپارچگی داده و رویدادها:
- چگونه اطلاعات مشتری (خریدار) (مانند نام، آدرس، اطلاعات تماس) را بین دو سرویس همگامسازی میکنید؟ آیا از رویدادهای دامنه (Domain Events) استفاده میکنید؟ مزایا و معایب رویکردهای مختلف را شرح دهید.
- چگونه اطلاعات مسافر و مهمان را در سرویسهای مربوطه مدیریت میکنید؟
- چگونه از بروز ناهماهنگی در دادهها جلوگیری میکنید؟ چه مکانیزمهایی برای حل تعارضات دادهای در نظر میگیرید؟
نحوه شناسایی و مدیریت مشتریان و مسافران/مهمانان:
- چگونه سیستم تشخیص میدهد که یک خریدار، مسافر و مهمان، در واقع یک شخص واحد هستند یا افراد مختلف؟
- چه مکانیزمهایی برای ادغام اطلاعات مشتریان تکراری در نظر میگیرید؟
- چگونه به حریم خصوصی و امنیت اطلاعات مشتریان و مسافران/مهمانان در این فرآیند توجه میکنید؟
قابلیت Observability سیستم:
- چگونه میتوانید ردیابی کنید که یک خریدار از هر دو سرویس استفاده کرده است؟ چه لاگها و متریکهایی را جمعآوری میکنید؟
- چه هشدارهایی را برای تیم پشتیبانی در صورت بروز مشکلات مربوط به شناسایی و مدیریت مشتریان و مسافران/مهمانان تعریف میکنید؟
بهینهسازی (Performance):
- با توجه به حجم بالای دادهها و تراکنشها، چگونه عملکرد سیستم را برای شناسایی و مدیریت مشتریان و مسافران/مهمانان بهینه میکنید؟
- آیا از caching (مانند Redis یا Memcached) در Domain Layer یا Application Layer استفاده میکنید؟ چه نوع دادهای را cache میکنید و با چه strategyای؟
- آیا از CQRS یا Event Sourcing برای بهبود performance سیستم Search یا Query side سیستم استفاده میکنید؟ چرا؟ مزایا و معایب استفاده از این الگوها در این سناریو چیست؟ این سوال انحرافی نیست!
اهداف چالش:
- طراحی یک مدل دامنه مناسب برای مدیریت اطلاعات خریداران و مسافران/مهمانان در دو سرویس مستقل.
- پیادهسازی مکانیزمهای مناسب برای شناسایی، مدیریت و یکپارچهسازی اطلاعات مشتریان و مسافران/مهمانان.
- طراحی یک معماری قابل مقیاس و قابل نگهداری برای مدیریت حجم بالای دادهها و تراکنشها.
- ایجاد راهحلی برای حفظ حریم خصوصی و امنیت اطلاعات مشتریان و مسافران/مهمانان.
- ایجاد گزارش ها و داشبوردهای کاربردی برای مدیران محصول جهت مشاهده و مدیریت اطلاعات مشتریان و مسافران/مهمانان