ثبت نام دوره جدید DDD و EventSourcing ...
0

چالش شماره DDD Plus 18 | مدیریت تغییرات سفارش و یکپارچگی با سیستم‌های خارجی با رویکرد رویدادمحور

⭕️ پیش‌زمینه:

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

⭕️ سناریو:

تصور کنید کاربری یک سفارش تور را با مشخصات زیر ثبت کرده است:

  • بلیط هواپیما: تهران-مشهد، تاریخ رفت: ۱۴۰۳/۰۸/۰۱
  • رزرو هتل: مشهد، هتل A، تاریخ ورود: ۱۴۰۳/۰۸/۰۱، مدت اقامت: ۲ شب

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

❓ صورت مسئله:

با توجه به سناریوی مطرح شده، به سوالات زیر پاسخ دهید:

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

⭕️ اهداف چالش:

  • درک عمیق‌تر مفاهیم Domain Events و Integration Eventsو نقش حیاتی آن‌ها در طراحی سیستم‌های توزیع‌شده.
  • پیاده‌سازی عملی و گام به گام مدیریت تغییرات سفارش با استفاده از رویکرد Event Based.
  • بررسی و مقایسه الگوهای مختلف موجود برای انتشار Integration Eventها و انتخاب الگوی مناسب.
  • درک چالش‌های مدیریت خطا، تضمین تحویل پیام و دستیابی به سازگاری نهایی در سیستم‌های توزیع‌شده.
  • ارتقاء و تقویت مهارت‌های طراحی سیستم‌های پیچیده با بهره‌گیری از مفاهیم و الگوهای DDD.

ارسال دیدگاه

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *