پیشزمینه:
همانند چالش ۱۷، در این چالش نیز به دنیای پیچیده مدلسازی سفارش در شرکت MyGlobalTravel.Com بازمیگردیم. فعلا قرار نیست از کار توی شرکت MyGlobalTravel.Com آزاد بشیم. MyGlobalTravel.Com، همانطور که قبلاً گفته شد، طیف وسیعی از خدمات گردشگری آنلاین از جمله رزرو بلیط هواپیما، قطار، اقامتگاه، اجاره خودرو، بیمه سفر و تورهای گردشگری را ارائه میدهد و به کاربران امکان میدهد تا ترکیبی از این خدمات را در قالب یک سفارش واحد خریداری کنند.

سناریو:
تصور کنید کاربری یک سفارش تور را با مشخصات زیر ثبت کرده است:
- بلیط هواپیما: تهران-مشهد، تاریخ رفت: ۱۴۰۳/۰۸/۰۱
- رزرو هتل: مشهد، هتل A، تاریخ ورود: ۱۴۰۳/۰۸/۰۱، مدت اقامت: ۲ شب
پس از ثبت سفارش، کاربر تصمیم میگیرد تاریخ پرواز خود را به ۱۴۰۳/۰۸/۰۳ تغییر دهد. این تغییر باید به طور صحیح در سیستم ثبت شده و به سیستمهای مرتبط (مانند سیستم رزرواسیون هواپیمایی و سیستم رزرو هتل) اطلاع داده شود. همچنین، این تغییر ممکن است منجر به تغییر قیمت بلیط و در نتیجه تغییر مبلغ کل سفارش شود که باید به درستی محاسبه و اعمال گردد.

صورت مسئله:
با توجه به سناریوی مطرح شده، به سوالات زیر پاسخ دهید:
- شناسایی Domain Eventها: حداقل سه Domain Event که در محدوده Aggregate سفارش رخ میدهند را شناسایی و نامگذاری کنید. برای هر رویداد، مشخص کنید که چه اطلاعاتی در آن رویداد ثبت و نگهداری میشود (به عنوان مثال، برای رویداد
FlightDateChanged
، تاریخ جدید پرواز و شناسه بلیط(یا بلیت)). مثال:
FlightDateChanged
: {FlightId
,NewDepartureDate
}HotelReservationModified
: {HotelReservationId
,NewCheckInDate
,NewDuration
}OrderTotalAmountUpdated
: {OrderId
,NewTotalAmount
}
- مدیریت Domain Eventها در Aggregate:
- چگونه Domain Eventها در داخل Aggregate سفارش ثبت و مدیریت میشوند؟
- مسئولیت انتشار این رویدادها بر عهده کیست؟ (Repository یا یک سرویس دامنه).
- یک نمونه کد (به صورت شبه کد یا کد C#) برای ثبت یک رویداد
FlightDateChanged
در Aggregate سفارش ارائه دهید.
- Integration Events و ارتباط با سیستمهای خارجی:
- برای اطلاعرسانی تغییر تاریخ پرواز به سیستم رزرواسیون هواپیمایی و سیستم رزرو هتل، چه Integration Eventهایی باید منتشر شوند؟ مثال:
FlightDateChangeRequestedInAirlineSystem
: {BookingReference
,NewDepartureDate
}HotelReservationModificationRequested
: {ReservationConfirmationNumber
,NewCheckInDate
}
- مشخص کنید که هر رویداد یکپارچگی دقیقاً به کدام سیستم خارجی ارسال میشود.
- برای اطلاعرسانی تغییر تاریخ پرواز به سیستم رزرواسیون هواپیمایی و سیستم رزرو هتل، چه Integration Eventهایی باید منتشر شوند؟ مثال:
- الگوی انتشار Integration Events:
- از چه الگویی برای انتشار Integration Eventهایی استفاده میکنید؟ (مانند Message Broker، Event Bus یا Outbox Pattern).
- مزایا و معایب الگوی انتخابی خود را در مقایسه با سایر الگوها به طور کامل توضیح دهید.
- مدیریت خطاهای یکپارچگی:
- اگر سیستم رزرواسیون هواپیمایی با خطا مواجه شود و نتواند تغییر تاریخ را اعمال کند، چه اتفاقی رخ میدهد؟
- چگونه این خطا را مدیریت کرده و به کاربر اطلاع میدهید؟ (از چه سازوکارهایی برای Retry یا Compensating Transaction استفاده میکنید؟)
- Eventual Consistency:
- با توجه به ماهیت توزیعشده سیستم، چگونه Eventual Consistency بین سیستمهای مختلف را تضمین میکنید؟
- مثالی عملی از چگونگی دستیابی به Eventual Consistency پس از تغییر تاریخ پرواز ارائه دهید.
اهداف چالش:
- درک عمیقتر مفاهیم Domain Events و Integration Eventsو نقش حیاتی آنها در طراحی سیستمهای توزیعشده.
- پیادهسازی عملی و گام به گام مدیریت تغییرات سفارش با استفاده از رویکرد Event Based.
- بررسی و مقایسه الگوهای مختلف موجود برای انتشار Integration Eventها و انتخاب الگوی مناسب.
- درک چالشهای مدیریت خطا، تضمین تحویل پیام و دستیابی به سازگاری نهایی در سیستمهای توزیعشده.
- ارتقاء و تقویت مهارتهای طراحی سیستمهای پیچیده با بهرهگیری از مفاهیم و الگوهای DDD.