محمد حسن رشیدی
محمد حسن رشیدی
خواندن ۱۰ دقیقه·۱ سال پیش

تاریخچه و تکامل الگوی Saga: راهکاری برای چالش‌های حفظ Consistency در سیستم‌های توزیع‌شده

مقدمه

الگوی ساگا (Saga) یک الگوی معماری استفاده شده در سیستم‌های توزیع‌شده (Distributed Systems) برای حفظ Consistency داده و مدیریت تراکنش‌های طولانی است. این الگو اطمینان می‌دهد که در صورت بروز خطاها یا موفقیت جزئی در هنگام اجرای یک تراکنش، داده‌ها همچنان در یک وضعیت همسان (Consistent) و درست باقی می‌مانند.[1]

سیستم‌های توزیع‌شده از چندین مولفه مستقل تشکیل شده‌اند که با حفظ ارتباط و هماهنگی با یکدیگر، یک وظیفه را انجام می‌دهند. در چنین سیستم‌هایی، حفظ Consistency داده به دلیل وجود خطاها، تاخیرهای شبکه و به‌روزرسانی‌های جزئی، چالش برانگیز است. Consistency داده مطمئن می‌شود که سیستم به طور قابل اعتماد عمل می‌کند و از خرابی داده یا وضعیت‌های نادرست جلوگیری می‌کند.[2]


تاریخچه الگوی ساگا

الگوی ساگا ابتدا توسط هکتور گارسیا-مولینا و کنت سالم در مقاله‌ی سال ۱۹۸۷ خود با عنوان "SAGAS" معرفی شد. آن‌ها مفهوم استفاده از ساگاها برای حفظ همسانی در سیستم‌های پایگاه داده توزیع‌شده را ارائه کردند.[1]

الگوی ساگا از مفاهیم تراکنش‌های توزیع‌شده (Distributed Transactions)، تراکنش‌های جبران کننده (Compensating transactions) و پروتکل دو مرحله‌ای تراکنش (two-phase commit) استفاده می‌کند. این الگو بر این اصول تکیه می‌کند و رویکردی انعطاف‌پذیرتر و قابل مقیاس‌پذیرتری برای مدیریت تراکنش‌های طولانی را ارائه می‌دهد.[3]

در طول سال‌ها، الگوی ساگا در صنعت محبوبیت زیادی پیدا کرده است، به خصوص با ظهور معماری مایکروسرویس‌ها (Microservices) و سیستم‌های مبتنی بر رویداد (Event-driven). ابزارها و کتابخانه‌های مختلفی برای تسهیل پیاده‌سازی ساگا در زبان‌های برنامه‌نویسی مختلف توسعه یافته است.[4]


هدف از الگوی ساگا

در سیستم‌های توزیع‌شده، حفظ Consistency داده به دلیل عواملی مانند خطاها در شبکه، خطاهای جزئی و نیاز به هماهنگی بین مولفه‌های مختلف، چالش‌برانگیز است. در محیط‌های توزیع‌شده، تراکنش‌های ACID سنتی که در سیستم‌های متمرکز (Centralized Systems) موثر هستند، محدودیت‌هایی دارند.[2]

الگوی ساگا با شکستن تراکنش‌های طولانی به یک سری مراحل کوچکتر به نام گام‌های ساگا (Saga Steps)، و اجرای تراکنش‌های جبران کننده، Consistency داده را در سیستم‌های توزیع‌شده حفظ می‌کند.[1] این الگو به توسعه‌دهندگان امکان می‌دهد برنامه‌هایی را با قابلیت تحمل‌خطا (Fault Tolerance)، مقیاس‌پذیری (Scalability) بالا و امکان توزیع کار را پیاده‌سازی کنند.[4]


الگوی ساگا چگونه کار می‌کند

ساگا به صورت یک ترتیب مراحل تعریف می‌شود. هر مرحله شامل یک تراکنش و یک تراکنش جبران‌کننده مرتبط است. هنگامی که یک مرحله با موفقیت اجرا می‌شود، تراکنش آن تأیید شده و اثرات آن ثبت می‌شود. در صورت بروز خطا در هر مرحله، تراکنش جبران‌کننده مرحله‌های قبلی برای بازگشت به وضعیت قبلی اجرا می‌شود.[1]

مدل ساگا، از سه مؤلفه اصلی تشکیل شده است: عملیات (Operations)، جبران‌ها (Compensations) و BASE Transactions. این مؤلفه‌ها با هم کار می‌کنند تا اجرای قابل‌اعتماد یک ساگا را تضمین کرده و با شکست‌ها در یک سیستم توزیع‌شده برخورد کنند.

  • عملیات (Operations): عملیات نشان‌دهنده بخش‌های مجزای کار در یک ساگاست. هر ساگا می‌تواند به تعدادی عملیات تقسیم شده و هر عملیات می‌تواند به عنوان یک تراکنش با گارانتی‌های ACID (شامل قواعد Atomicity, Consistency, Isolation, Durability) پیاده‌سازی شود. وقتی یک عملیات به پایان می‌رسد، انتظار می‌رود که همه نتایج کار آن در ذخیره‌سازی دائمی محفوظ شود. مهم است به یاد داشت که ساگا به سیستم اجازه می‌دهد در حالت‌های میانی در طول اجرایش باشد و فراخوانی‌های جداگانه عملیات می‌توانند ناهمخوانی‌ها را به وجود آورند. امکان تراکنش جزئی نقض خاصیت عزل را ایجاد می‌کند، اما ساگا از مدل سازگاری در نهایت (Eventual Consistency) استفاده می‌کند که تضمین می‌کند سیستم پس از پایان ساگا (چه با موفقیت یا از طریق تماس های جبرانی) سازگار خواهد شد.
  • جبران‌ها (Compensations): هر عملیات در یک ساگا باید یک عملیات جبران مرتبط داشته باشد. هدف از عملیات جبران، لغو معنایی کاری است که توسط عملیات اصلی انجام شده است. این عملیات جبران، عمل معکوس است که سیستم را به وضعیت دقیقاً قبل از آغاز عملیات یا به طور کلی ساگا بازمی‌گرداند. هدف عملیات جبران، لغو اثرات عملیات و رسیدن سیستم به یک وضعیت سازگار است. با داشتن جبران برای هر عملیات، ساگا می‌تواند با شکست‌ها برخورد کند و تضمین کند که یا همه عملیات‌ها به‌طور موفقیت‌آمیز انجام می‌شوند یا جبران‌ها برای تمام عملیات‌های اجرا شده اجرا می‌شوند تا پردازش جزئی لغو شود.
  • تراکنش‌های BASE: الگوی ساگا نیازمندی‌های ACID سنتی را کاهش داده تا با دستیابی به قابلیت استفاده و مقیاس‌پذیری همراه با مدیریت شکست‌ها مطابقت کند. در مقابل تعهد همه یا هیچ در تراکنش‌های سنتی، ساگا هر عملیات را به‌طور جداگانه تایید می‌کند. این به این معناست که بروزرسانی‌های ساگاهایی که هنوز کامل نشده‌اند، بلافاصله برای عملیات‌های موازی قابل مشاهده هستند و خاصیت عزل را نقض می‌کنند. برای دستیابی به قابلیت استفاده، مدل BASE (شامل قواعد Basically Available, Soft State Eventual Consistency) به جای تضمین‌های ACID سخت استفاده می‌شود. مدل BASE بر طبق قضیه‌ی CAP (شامل قواعد Consistency, Availability, Partition tolerance)، همیشه در دسترس بودن (Availability) را بر ثبات (Consistency) اولویت می‌دهد و تضمین می‌کند که سیستم در دسترس باقی می‌ماند. ساگا اجازه می‌دهد وضعیت در طول زمان بتواند فوری تغییر کند (Soft State)، و به سیستم اجازه می‌دهد تا به طور موقت در حالت‌های ناسازگار باشد. با این حال، ویژگی سازگاری نهایی تضمین می‌کند که سیستم در نهایت به حالت سازگار می‌رسد اگر درخواست بروزرسانی جدیدی دریافت نکند.[5]


برای پیاده‌سازی ساگا، دو رویکرد متداول وجود دارد: Orchestration و Choreography.


در Orchestration، یک سرویس ارکستراتور متمرکز (Centralized Orchestrator) مسئول هماهنگی و اجرای مراحل ساگا تمامی سرویس‌ها است. ارکستراتور جریان ساگا را کنترل می‌کند، ترتیب مراحل را تعیین می‌کند و با خدمات فردی برای اجرای مراحل و جبران تراکنش‌ها ارتباط برقرار می کند. این رویکرد متمرکز منطق هماهنگی را ساده می‌کند اما یک نقطه شکست (Single point of failure) و گلوگاه‌های (bottlenecks) بالقوه عملکرد را معرفی می‌کند.[4]

Orchestration
Orchestration


در Choreography، هر مرحله از ساگا توسط خود سرویس‌ها کنترل می‌شود و هماهنگی بین آن‌ها توسط تبادل پیام‌ها صورت می‌گیرد. هیچ ارکستراتور متمرکزی در کار نیست و هماهنگی از طریق ارسال پیام انجام می‌شود. سرویس‌ها پیام‌ها را مبادله می‌کنند و بر اساس پیام‌های دریافتی تصمیمات محلی می‌گیرند. این رویکرد غیرمتمرکز (Decentralized) وابستگی به یک کامپوننت یا سرویس را کاهش می‌دهد، اما می‌تواند سیستم را برای درک و نگهداری پیچیده‌تر کند.[6]

choreography
choreography



ابزارهای پیاده‌سازی الگوی ساگا در دات‌نت (Net.):

در بستر دات‌نت، ابزارها و فریم‌ورک‌های مختلفی برای پیاده‌سازی الگوی ساگا وجود دارد. برخی از این ابزارها عبارتند از:

  1. فریم‌ورک NServiceBus: این ابزار امکان پیاده‌سازی ساگا را در برنامه‌های دات‌نت با استفاده از رویکرد Choreography فراهم می‌کند.
  2. فریم‌ورک Rebus: یک کتابخانه سبک و قابل استفاده در برنامه‌های دات‌نت، ساگا را ارائه می‌دهد.
  3. فریم‌ورک MassTransit: یک فریم‌ورک قدرتمند برای توسعه سیستم‌های توزیع‌شده در دات‌نت است که از الگوی ساگا حمایت می‌کند.

مزایا و معایب هر ابزار:

فریم‌ورک NServiceBus:

مزایا:

  • ارائه یک چارچوب جامع برای ساخت سامانه‌های توزیع‌شده، از جمله پشتیبانی از الگوی Saga.
  • فراهم کردن ویژگی‌هایی مانند مسیریابی پیام، انتشار/اشتراک (Publish–subscribe) پیام و ذخیره‌سازی دائمی.
  • پشتیبانی از گزینه‌های انتقال مختلف مانند RabbitMQ، Azure Service Bus، MSMQ و غیره.
  • داشتن امکانات نظارت و مدیریت داخلی.

معایب:

  • فریم‌ورک NServiceBus یک محصول تجاری است و ممکن است نیاز به مجوز برای استفاده تجاری داشته باشد.
  • برخی از ویژگی‌های پیشرفته ممکن است نیاز به یادگیری بیشتری داشته باشد.


فریم‌ورک Rebus:

مزایا:

  • کتابخانه‌ی سبک و آسان برای ارسال و پردازش پیام در سامانه‌های توزیع‌شده که از الگوی Saga پشتیبانی می‌کند.
  • ارائه‌ی API ساده برای ارسال و پردازش پیام در سامانه توزیع‌شده.
  • پشتیبانی از گزینه‌های انتقال متعدد، از جمله RabbitMQ، Azure Service Bus و غیره.
  • امکانات گسترش‌پذیری و امکان شخصی‌سازی از طریق Middleware و Decorators.

معایب:

  • ممکن است نسبت به چارچوب‌های بزرگتر مانند MassTransit یا NServiceBus، ویژگی‌ها و ابزارهای پیشرفته‌تری را نداشته باشد.
  • حجم پشتیبانی از جامعه ممکن است نسبت به چارچوب‌های پراستفاده تر کوچکتر باشد.


فریم‌ورک MassTransit:

مزایا:

  • ارائه پشتیبانی داخلی برای الگوی Saga از طریق استفاده از ماشین‌های وضعیت.
  • فراهم کردن چارچوبی قابل انعطاف و قابل گسترش برای ساخت سامانه‌های توزیع‌شده.
  • پشتیبانی از گزینه‌های انتقال متعدد، از جمله RabbitMQ، Azure Service Bus و غیره.
    ارائه مکانیزم‌های تحمل خطا و تلاش مجدد برای پیام‌ها.

معایب:

  • نیاز به یادگیری چارچوب MassTransit و مفاهیم آن.
  • ممکن است به پروژه شما وابستگی‌های اضافی ایجاد کند.

بهترین روش‌ها (Best Practices ) و ملاحظات (Considerations)

  • طراحی ساگاها برای قابلیت مقیاس‌پذیری(Scalabilityُ) و عملکرد (Performcane): هنگام طراحی ساگاها، مهم است که جنبه‌های قابلیت مقیاس‌پذیری و عملکرد را در نظر بگیرید. این شامل کمینه کردن وابستگی‌ها، بهینه‌سازی تراکنش‌های جبرانی و توزیع بار کاری به طور کارآمد بین اجزا می‌شود.
  • رعایت اتمیت Atomicity و Idempotency در تراکنش‌های جبرانی: تراکنش‌های جبرانی باید به گونه‌ای طراحی شوند که Atomicity و Idempotency داشته باشند. Atomicity مطمئن می‌شود که یک تراکنش جبرانی یا به طور کامل اجرا می‌شود یا به طور کامل نادیده گرفته می‌شود، در حالی که Idempotency تضمین می‌کند که اجرای چندین بار یک تراکنش جبرانی همان تأثیر اجرای یک بار داشته باشد.

الگوی ساگا در مقابل تراکنش‌های سنتی ACID

  • مقایسه الگوی ساگا با تراکنش‌های دوفازی (Two-phase commits): الگوی ساگا از پروتکل سنتی دوفازی استفاده شده در تراکنش‌های ACID تفاوت دارد. در حالی که تراکنش‌های ACID به Atomicity جهانی هدف دارند، ساگاها با اجازه‌ی موفقیت جزئی و جبران خطاها در دقت بیشتری راه حل انعطاف‌پذیرتری را فراهم می‌کنند.
  • زمان استفاده از ساگاها در مقابل تراکنش‌های ACID: ساگاها برای سناریوهایی مناسب هستند که نیاز به تراکنش‌های طولانی و یکپارچگی توزیع‌شده دارند. تراکنش‌های ACID برای تراکنش‌های تک پایگاه داده یا مواردی که یکپارچگی جهانی قوی (Strong global consistency) ضروری است، مناسب هستند.


نتیجه‌گیری

الگوی ساگا به عنوان یک ابزار قدرتمند در حفظ Consistency داده‌ها در سیستم‌های توزیع‌شده ظهور کرده است. رویکرد قابل انعطاف آن در مدیریت معاملات طولانی‌مدت (Long-running transactions) و رسیدگی به خطاها، آن را به یک انتخاب محبوب در معماری‌های مدرن تبدیل کرده است. با تجزیه تراکنش‌ها به مراحل کوچک و مستقل و استفاده از تراکنش‌های جبرانی، الگوی ساگا تضمین می‌کند که حتی در مواجهه با موفقیت‌های ناقص یا خطاها، داده‌ها در حالت سازگار باقی می‌مانند.

مدل‌های هماهنگی Orchestration و Choreography رویکردهای متفاوتی را برای پیاده‌سازی الگوی ساگا فراهم می‌کنند که هر کدام مزایا و معایب خود را دارد. Choreography به ارتباطات و تصمیم‌گیری غیرمتمرکز بین سرویس‌ها اجازه می‌دهد، در حالی که Orchestration کنترل را متمرکز می‌کند اما ممکن است نقاط ضعفی مانند Single point of failure را به همراه داشته باشد. در انتخاب رویکرد مناسب برای یک سیستم خاص، شناختن نقاط قوت و ضعف این مدل‌ها بسیار حائز اهمیت است.

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

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

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

در پایان، الگوی ساگا رویکرد مهمی در مدیریت Consistency داده‌ها در سیستم‌های توزیع‌شده ارائه می‌دهد. توانایی مدیریت معاملات طولانی‌مدت، رسیدگی به خطاها و ارائه انعطاف‌پذیری در سیستم‌های توزیع‌شده، این الگو را به یک ابزار ضروری برای ساخت سیستم‌های قابل اعتماد و قابل مقیاس تبدیل کرده است. با شناخت اصول آن، در نظر گرفتن مدل‌های هماهنگی و استفاده از چارچوب‌های مناسب، توسعه‌دهندگان می‌توانند به طور موثر از الگوی ساگا برای تضمین سازگاری داده‌ها در سیستم‌های توزیع‌شده خود استفاده کنند و موفقیت برنامه‌های خود را به دست آورند.


الگوی sagamicroservicesorchestration vs choreographyمهندسی نرم افزاربرنامه نویسی
مهندس نرم‌افزار
شاید از این پست‌ها خوشتان بیاید