تخطَّ إلى المحتوى

Saga

نمط Saga — المعاملات الموزعة Saga

يدير معاملة تمتد عبر عدة خدمات كسلسلة خطوات محلية، مع خطوات تعويض (Compensation) تُلغي ما تم لو فشلت إحدى الخطوات.

بما أن كل خدمة لها قاعدة بياناتها الخاصة، لا يمكن استخدام معاملة ACID تقليدية تمتد عبر عدة خدمات. Saga يقسّم العملية لسلسلة خطوات محلية، كل خطوة معاملة ACID داخل خدمتها فقط، مع خطوة تعويض مقابلة لكل خطوة لإلغاء أثرها لو فشلت خطوة لاحقة.

هناك أسلوبان: Choreography حيث تتفاعل الخدمات مع أحداث بعضها دون منسّق مركزي، وOrchestration حيث تتحكم خدمة مركزية بترتيب الخطوات وتستدعي التعويض عند الفشل.

الصياغة

Step1 (commit) → Step2 (commit) → Step3 (fail)
→ Compensate(Step2) → Compensate(Step1)

📄 مثال

// Orchestration مبسّط
try {
  await orderRepo.create(order);
  await inventoryRepo.reserve(order.items);
  await paymentRepo.charge(order.total);
} catch {
  await inventoryRepo.release(order.items); // تعويض
  await orderRepo.cancel(order.id);          // تعويض
}

أهم النقاط

العنصرالوظيفة
Choreographyالخدمات تتفاعل عبر أحداث بلا منسّق مركزي — بسيط لكن صعب التتبع
Orchestrationمنسّق مركزي يتحكم بالتسلسل — أسهل تتبعاً، لكنه نقطة مركزية

💡 نصائح عملية

  • اجعل كل خطوة Idempotent — قد تُعاد المحاولة أو المعالجة أكثر من مرة
  • استخدم Choreography للتدفقات القصيرة البسيطة، وOrchestration للتدفقات الطويلة المعقدة

⚠️ أخطاء شائعة

  • نسيان كتابة خطوة تعويض لخطوة قابلة للفشل — يترك النظام في حالة غير متسقة
  • معاملة Saga كأنها ACID كاملة — هي اتساق نهائي (Eventual Consistency) لا فوري

خصائص ذات صلة

🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار MICROSERVICES الكامل بالعربي.