⭕️ پیشزمینه:
همانند چالش ۱۷، در این چالش نیز به دنیای پیچیده مدلسازی سفارش در شرکت 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.