Saeid Noormohammadi
Saeid Noormohammadi
خواندن ۲ دقیقه·۲ ماه پیش

Saga Design Pattern


دیزاین پترن Saga برای مدیریت distributed transaction ها استفاده می شود. در این دیزاین پترن هر تراکنش بزرگ به چندین عملیات کوچکتر تقسیم می شود و هرکدام به صورت مستقل از دیگری اجرا می شود. همچنین برای هر عملیات اصلی یک عملیات جبرانی (Compensating Action) وجود دارد که در صورت بروز مشکل برای عملیات اصلی یک عملیات جبران برای بازگرداندن تغییرات انجام می شود.

مثال: اسنپ فود یا تپسی فود را در نظر بگیرید، پس از انتخاب غذا پرداخت رو انجام می دید، سفارش رو تحویل می گیرید و بعد از تحویل سفارش وضعیت تحویل در سیستم تغییر می کند.

فرض می کنیم که این بخش ها هرکدوم یک سرویس جدا دارند:
Order Service: مسئول ثبت سفارش و ایجاد رکورد جدید.
Payment Service: مسئول پردازش پرداخت و تایید آن.
Delivery Service: مسئول تحویل سفارش و تایید تحویل.

اینجا دوتا سناریو داریم
سناریو اول: تمام مراحل با موفقیت انجام شده و سفارش تحویل داده می شود.
سناریو دوم: پس از ثبت سفارش و پرداخت به دلیل پیدا نشدن پیک، تحویل سفارش ناموفق هستش(قسمت کسی نشه), خب اینجا باید سفارش لغو و پول کاربر برگشت داده شود.

نکته: اینجا مرحله آخر رو به این شکل در نظر گرفتم که پیک رو برای تحویل چک می کنه(نه به این شکل که بعد سفارش کاربر منتظر باشه هروقت پیک بود سفارش رو تحویل بگیره!) - خلاصه که هدف از مثال درک موضوع هستش 😀

اینجاست که Saga Pattern وارد می شود. برای پیاده‌سازی Saga دو مدل choreography و orchestration وجود دارد:
مدل choreography: در این مدل سرویس ها به ترتیب عملیات ها را شروع و مدیریت می کنند. هر سرویس بعد از اجرا موفق عملیات خود به سرویس بعدی اطلاع میده تا کارش رو شروع کنه. حالا اینجا اگر هر سرویسی در انجام عملیات به مشکل بخوره عملیات جبرانی توسط سرویس های قبلی به ترتیب اجرا می شود.

مزایا:
- سادگی در پیاده‌سازی به این دلیل که سرویس ها به طور خودکار باهم تعامل دارند و نیازی به سرویس مرکزی ندارند.
- به دلیل اینکه عملیات ها بین سرویس ها توزیع شده می باشند هیچ SPOF(single point of failure) وجود ندارد.
معایب:
احتمال cyclic dependency زیاد می باشد، به این دلیل که سرویس ها با دستورها یکدیگر کار می کنند

مدل Orchestration:
در این مدل بر خلاف مدل choreography یک هماهنگ کننده مرکزی داریم که همه مراحل و سرویس ها را مدیریت می کند. به زبان ساده این Saga Orchestrator اجرای عملیات های اصلی و عملیات های جبرانی را مدیریت می کند.

مزایا:
برای مدیریت فرایندهای پیچیده هنگامی که تعداد سرویس ها زیاد می باشد مناسب است.
احتمال cyclic dependency بسیار کم می باشد، زیرا مدیریت تمام فرایندها توسط هماهنگ کننده مرکزی(Saga Orchestrator) انجام می شود.
معایب:
- پیاده‌سازی منطق هماهنگی مناسب پیچیده می باشد.
- وجود یک SPOF به دلیل مدیریت تمام فرایندها.

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

microservicessagapatterntransactionmanagementdistributedsystemsمدیریت
شاید از این پست‌ها خوشتان بیاید