تكرار السؤال: …
الإجابة المختصرة
بروتوكول 2PC يفرض قفلاً موزعاً متزامناً عبر منسق مركزي يضمن الاتساق الصارم لكنه يعاني من بطء شديد ونقطة فشل مفردة، بينما يدير نمط Saga المعاملات كسلسلة من المعاملات المحلية المنفصلة مع معاملات تعويضية (Compensating Transactions) للتراجع عند الفشل.
الشرح
في نمط Saga، تنفذ كل خدمة معاملتها المحلية وتطلق حدثاً يخبر الخدمة التالية لإكمال دورها. إذا فشلت خطوة في المنتصف (مثل رفض بطاقة الائتمان في خدمة الدفع بعد حجز المقعد في خدمة التذاكر)، تطلق الخدمة حدث فشل وتبدأ خطة التراجع بتنفيذ معاملات تعويضية بالعكس (إلغاء حجز المقعد). ينقسم Saga إلى: Choreography (حيث تتواصل الخدمات ذاتياً عبر الأحداث) أو Orchestration (حيث يوجه منسق مركزي الأوامر والتعويضات).
مثال بالكود
def place_order(order):
done = []
steps = [
(create_order, cancel_order),
(reserve_inventory, release_inventory),
(charge_card, refund_card),
]
try:
for action, compensate in steps:
action(order) # each step is a LOCAL transaction in its own service
done.append(compensate)
except Exception:
for compensate in reversed(done): # compensating transactions run newest first
compensate(order)
mark_order_failed(order)
raiseأخطاء شائعة
- استخدام بروتوكول Two-Phase Commit (2PC) في بيئات الخدمات السحابية واسعة النطاق، مما يسبب بطئاً شديداً وحجب الموارد عند أي اضطراب شبكي.