Amirali Yaghoutiمهندس ارشد نرم‌افزار

مطالعه موردی مهندسی

پلتفرم رزرو هوشمند

یک سیستم رزرو، یک مسئله‌ی هم‌زمانی است که لباس تقویم پوشیده. دو نفر می‌توانند یک اسلات را در یک لحظه بخواهند، یک کال‌بک پرداخت می‌تواند دوبار برسد، و یک مشتری می‌تواند بین پرداخت و تأیید تب را ببندد. کار جالب کاملاً در همین حالت‌هاست.

مسئله تجاری

کد رزرو ساده‌لوحانه اول موجودی را بررسی می‌کند و بعد یک رزرو می‌نویسد، که پنجره‌ای باقی می‌گذارد که در آن هر دو درخواست اسلات را آزاد می‌بینند. پرداخت بدترش می‌کند: درگاه‌ها کال‌بک‌هایشان را دوباره می‌فرستند، پس همان پرداخت موفق می‌تواند دو یا سه بار برسد، و هر handler‌ای که idempotent نباشد رزروهای تکراری یا اعتبار تکراری در برابر یک پرداخت می‌سازد.

آنچه تحویل دادم

  • یک پایه‌ی بیعانه و رزرو خریدار که در آن رزرو در برابر یک پرداخت تأییدشده ساخته می‌شود نه خوش‌بینانه.
  • idempotency روی کال‌بک پرداخت ووکامرس، تا یک اعلان تکراری برای همان پرداخت همان یک رزرو واحد را تولید کند.
  • ظرفیت و قوانین زمانی تعریف‌شده توسط ادمین، تا محدودیت‌ها پیکربندی باشند نه اینکه در منطق رزرو کدگذاری شوند.
  • یک تاریخچه‌ی وضعیت و خط زمانی روی رکورد زیرین، تا توالی وضعیت‌هایی که یک رزرو از آن‌ها گذشته بعداً خوانا باشد.
  • یک لایه‌ی ممیزی و رویداد زیر آن، تا تغییرات وضعیت همان‌طور که اتفاق می‌افتند ثبت شوند نه اینکه از ردیف فعلی بازسازی شوند.
  • فلگ‌های فیچر و یک مدیر اسکیما، تا کار رزرو مستقل از بقیه‌ی پلتفرم توسعه و فعال شود.

رویکرد فنی

  • idempotency از ابتدا روی کال‌بک طراحی شده، نه اینکه بعد از اولین تکرار اضافه شود. تلاش مجدد درگاه رفتار عادی است نه شرط خطا، و handler‌ای که تحویل دقیقاً-یک‌بار را فرض کند از روز اول اشتباه است.
  • ظرفیت و قوانین زمانی توسط ادمین تعریف می‌شوند تا همان معماری بدون تغییر کد به مدل‌های کسب‌وکار مختلف خدمت کند، که نکته‌ی ساختنش به‌عنوان یک پایه‌ی قابل استفاده‌ی مجدد بود.
  • انتقال‌های وضعیت به‌عنوان تاریخچه ثبت می‌شوند نه اینکه بازنویسی شوند، چون اختلاف بر سر یک رزرو همیشه پرسشی درباره‌ی توالی است نه وضعیت فعلی.
  • این کار پشت فلگ‌های فیچر با مدیریت اسکیمای خودش می‌نشیند، که همان چیزی است که اجازه داد تدریجی وارد یک پلتفرم زنده شود.

نتیجه و شواهد

رزروها به‌ازای هر پرداخت تأییدشده یک بار ساخته می‌شوند فارغ از اینکه درگاه چند بار کال‌بک بزند، و قوانین ظرفیت پیکربندی‌اند نه کد. پایه تا مرحله‌ی رزرو و بیعانه سر جایش است؛ صدور گواهی، تحویل و تسویه مراحل جداگانه‌ی بعدی‌اند.

اهمیت برای کارفرما

رزرو دوباره و شارژ دوباره دو شکستی هستند که یک سیستم رزرو نمی‌تواند داشته باشد، چون هر دو برای مشتری قابل‌دیدن و برای جبران گران‌اند. طراحی برایشان از ابتدا خیلی ارزان‌تر از کشفشان بعداً است.

خلاصه-اجرایی-پروژه

خلاصه اجرایی خوانا

خلاصه_اجرایی {
  پروژه: "Smart Reservation Platform"
  پایه: "a2-javaherian-watch-bazaar، افزونه‌ی ماژولار وردپرس"
  رزرو: "در برابر یک پرداخت تأییدشده ساخته می‌شود،
         هرگز خوش‌بینانه"
  idempotency: "کال‌بک پرداخت ووکامرس idempotent است؛
                تلاش مجدد درگاه عادی است نه خطا"
  قوانین: "ظرفیت و بازه‌های زمانی پیکربندی ادمین‌اند"
  سابقه: "تاریخچه‌ی وضعیت + خط زمانی + لایه‌ی ممیزی/رویداد"
  عرضه: "فلگ فیچر + مدیر اسکیما، تدریجی روی پلتفرم زنده"
  دامنه: "پایه تا بیعانه/رزرو؛ صدور، تحویل و تسویه بعداً"
}

ارزش حرفه‌ای این پروژه

idempotency کال‌بک همان بخشی است که دوست دارم بررسی شود. سخت نیست، فقط به‌طور روتین حذف می‌شود، و همان نقصی است که به‌شکل مشتری‌ای که دوبار شارژ شده ظاهر می‌شود.

صراحت درباره‌ی اینکه چه چیزی ساخته شده و چه چیزی نه عمدی است. این پایه‌ای تا مرحله‌ی بیعانه و رزرو است، و توصیفش به‌عنوان یک مارکت‌پلیس تمام‌شده گمراه‌کننده بود.