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

آشنایی با مفهوم الگوی SAGA

الگوی کاربردی SAGA را می‌توان یک مفهوم معماری قدیمی دانست که هنوز هم برای میکروسرویس‌های امروزی بسیار سودمند است. استفاده از الگوهای حماسه می‌تواند برای سیستم‌ها و برنامه‌های مختلف سودمند بوده و مزایای زیادی را با خود به همراه داشته باشد. SAGA دنباله‌ای از تراکنش‌های محلی در هر یک از میکروسرویس‌های شرکت‌کننده است. برای پیاده‌سازی SAGA مراحلی وجود دارد که اجراشدن هرکدام از آن‌ها الزامی است و زمانی که کامل شوند، منطقی وجود دارد که تصمیم می‌گیرد چه کاری انجام شود.
SAGA باید تضمین کند که تمامی مراحل با موفقیت به پایان رسیده است؛ در غیر این صورت، باید مقدمات لازم برای بازگشت را فراهم کند. هنگام ارائه درخواست ممکن است با استثنائات قانون زیرساخت یا منطق تجاری نیز روبرو شویم. البته نیاز است که تمامی این استثنائات را مدیریت کنیم و اگر در مرحله خاصی استثنا داریم، تمام تغییرات مراحل قبلی را نیز لغو کنیم. در بعضی مواقع، برای انجام بازگشت کامل باید درخواست‌های اضافی را به میکروسرویس‌ها ارائه دهیم.
این درخواست‌های اضافی به‌عنوان تراکنش‌های جبرانی شناخته می‌شوند و همه این موارد می‌توانند به این معنا باشند که استفاده از الگوهای saga قابلیت پیچیده‌سازی برنامه‌ها را دارند.

راهکارهای پیاده‌سازی SAGA

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

استفاده از روش Orchestration (متمرکز)

در این روش یک هماهنگ‌کننده مرکزی وجود دارد که مسئول فراخوانی خدمات از راه دور برای استفاده از الگوی saga است.

اگر هر یک از میکروسرویس ها با مشکل مواجه شود، orchestrator مسئول فراخوانی تراکنش های جبرانی لازم است:

 

الگوی Orchestration Saga برای معماری توسعه اپلیکیشن میکروسرویس Brownfield مفید است. به عبارت دیگر، این الگو زمانی کار می کند که ما از قبل مجموعه ای از میکروسرویس ها را داشته باشیم و بخواهیم الگوی Saga را در برنامه پیاده سازی کنیم. برای پیشبرد این الگو باید تراکنش های جبرانی مناسب را تعریف کنیم.

در اینجا چند فریم ورک موجود برای اجرای الگوی orchestrator  وجود دارد:

Camunda  یک چارچوب مبتنی بر جاوا است که از استاندارد مدل و نشانه گذاری فرآیند کسب و کار (BPMN) برای گردش کار و اتوماسیون فرآیند پشتیبانی می کند.
Apache Camel پیاده سازی Saga Enterprise Integration Pattern (EIP) را فراهم می کند.

استفاده از روش Choreography (توزیع شده)

در این روش هیچ‌گونه هماهنگ‌کننده مرکزی وجود ندارد و به همین دلیل، هر سرویس باید گوش‌به‌زنگ باشد و رویدادها را تولید کند. همچنین سرویس‌ها باید در خصوص اقداماتی که نیاز به اجراشدن دارند، تصمیم‌گیری کنند.

برای استفاده از این الگو، باید تصمیم بگیریم که آیا میکروسرویس بخشی از Saga خواهد بود یا خیر. بر این اساس، میکروسرویس باید از چارچوب مناسب برای اجرای Saga استفاده کند. در این الگو، Saga Execution Coordinator یا در میکروسرویس تعبیه شده است یا می تواند یک جزء مستقل باشد.

در Saga، اگر همه میکروسرویس ها تراکنش محلی خود را کامل کنند، جریان رقص موفقیت آمیز است و هیچ یک از میکروسرویس ها هیچ گونه شکستی را گزارش نکرده اند.

در اینجا چند فریم ورک موجود برای اجرای الگوی choreography  وجود دارد:

Axon Saga – یک فریم ورک سبک وزن و به طور گسترده با میکروسرویس های Spring Boot-based استفاده می شود
Eclipse MicroProfile LRA – اجرای تراکنش های توزیع شده در Saga برای انتقال  HTTP بر اساس اصول REST
Eventuate Tram Saga – فریم ورک ارکستراسیون Saga برای خدمات میکرو سرویس های Spring Boot و Micronaut
Seata – فریم ورک تراکنش های توزیع شده منبع باز با خدمات تراکنش های توزیع شده با کارایی بالا و آسان برای استفاده

در ادامه جزئیات بیشتری در خصوص این دوراه پیاده‌سازی saga ارائه خواهیم کرد.

استفاده از روش Orchestration (متمرکز):

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

استفاده از روش Choreography (توزیع شده)

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

 

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

شناسه تراکنش جهانی می‌تواند به نظارت یا اشکال‌زدایی کمک کند و به کمک آن می‌توانیم بدانیم که کدام تراکنش شکست‌خورده است و اقدامات مناسب را برای رفع آن انجام دهیم.

الگوی SAGA به ما اجازه نمی‌دهد تا از قفل‌های واقعی استفاده کنیم که همین امر می‌تواند منجر به ناسازگاری داده‌ها شود درحالی‌که هنوز SAGA در حال انجام است. برای جلوگیری از تغییر مقادیر اشتباه سایر تراکنش‌ها می‌توان از مقادیر حالت موقت استفاده کرد و مطمئن شد که یکپارچگی داده‌ها حفظ می‌شود.

بازگرداندن پاسخ‌ها

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

الگوی SAGA در معماری میکروسرویس دارای مزایا و معایب خاص خود بوده است که بسته به نیاز می‌توان از آن استفاده کرد. به‌طورکلی، اگر به فرایندهای بازگشتی با جبران تراکنش نیاز دارید یا با تراکنش‌های طولانی‌مدت در ارتباط هستید، استفاده‌کردن از SAGAها می‌تواند بهترین گزینه برای شما باشد. با استفاده از دو روش Orchestration و Choreography می‌توانید اقدام به پیاده‌سازی الگوهای saga خودکرده و مدیریت سازگاری داده‌ها بین میکروسرویس را تضمین کنید.