menuTicketing

مبدأ العمل


الحصول على القفل وإطلاقه

عندما يحاول العميل الحصول على مفتاح (A)، يرد الخادم بأحد الخيارات الثلاثة التالية.

حالة المفتاحإجراء الخادمالرد
غير مسجلتسجيل فوري (الانتهاء = الآن + المدة)، إصدار رمزA + token + key
مسجل + انتهت الصلاحيةتحديث (الآن + المدة)، إصدار رمز جديدA + token + key
مسجل + صحيح (قيد الاستخدام)تسجيل في قائمة الانتظار، تأجيل الردA عند الإطلاق، T عند تجاوز الانتظار
  • الإطلاق يتم بعدالة FIFO. عندما يطلق الحامل المفتاح (R)، يُمرر مباشرة إلى مقدمة قائمة الانتظار — دون منافسة جديدة، يُنقل فوراً برمز جديد.
  • lease هو شبكة أمان. إذا توقف العميل أو نسي الإطلاق، فبعد انقضاء وقت lease، يمكن للخادم استعادة المفتاح تلقائياً وتمريره إلى المنتظر التالي. لذا من الجيد تعيين lease بكرم، لكن ليس طويلاً جداً بحيث يُعطل المفتاح إذا توقف العميل.
  • wait هو الحد الأقصى لانتظار الحصول. إذا كان 0، فانتظار لا نهائي؛ وإلا، إذا لم يتمكن من الحصول خلال تلك الثواني، يستسلم الخادم ويرد T (timeout) — بدون منح، لذا لا يوجد تسرب قفل.

رمز الحماية (Fencing Token)

token في رد A هو u64 متزايد رتيب لكل منحة. في كل مرة يتم الحصول عليه، يكون أكبر من أي رمز سابق. حتى إذا حدث failover، تبدأ العقدة الجديدة النشطة من قيمة أكبر من الحد الأقصى للرمز المستقبل (الخلافة) — لذا عبر الكتلة بأكملها، يستمر الرمز في الزيادة.

إذا كان المورد المحمي (حساب، ملف، طلب، إلخ) يتحقق فقط من "هل الرمز الحالي أكبر من آخر رمز رأيته"، يمكنه رفض وصول العميل الذي يستيقظ بتأخير بعد انتهاء lease برمز منخفض بالفعل. بفضل هذا، حتى لو لم يكن خادم القفل متسقاً بشكل مثالي في كل لحظة، لا يزال آمناً.

سلوك العميل

تتصرف العملاء الرسميون بشكل مشترك كما يلي (انظر المكتبات للتفاصيل المحددة لكل لغة).

  • الحفاظ على اتصال دائم واحد لكل عنوان وإدارته في الخلفية. إذا تم إعطاء عنوان واحد فقط، سيتم الاحتفاظ داخلياً باتصالين للعقدة نفسها، بحيث حتى إذا انقطع أحدهما للحظة، لن تُقطع الخدمة.
  • اختيار الاتصالات بطريقة round-robin. العقد ذات الاتصالات المقطوعة تُستبعد تلقائياً، والمحاولة إعادة الاتصال في الخلفية كل 3 ثوانٍ.
  • يتم توصيل الطلبات. يمكنك إرسال الطلب التالي دون انتظار الرد، والترتيب قد يكون مختلفاً — يميز العميل من خلال الجمع بين (op, key) المُعاد حيث ينتمي الرد. إذا كان هناك عدة طلبات بنفس الجمع (op, key)، يتم مطابقتها بالترتيب المرسل.
  • إذا قُطع الاتصال أثناء محاولة الحصول، يتبدل تلقائياً للاتصال التالي. بعد محاولة عدد الاتصالات المسجلة، إذا لم يكن هناك اتصال متاح، فقط حينها يُبلغ عن خطأ.
  • يُعاد محاولة الإطلاق 200 ملي ثانية كل 5 ثوان — حتى لو انقطع الاتصال في لحظة الإطلاق، لن يبقى القفل على الخادم (في النهاية lease سيستعيده، لكن الهدف هو تمرير المفتاح للمنتظر التالي بسرعة).

الكتلة — الترقية القائمة على الأولويات بدون توقف

  • ترتيب قائمة peers هو أولوية الترقية (الأمام له الأولوية الأعلى). من بين العقد الحية، العقدة ذات الأولوية الأعلى هي النشطة، والباقي هي احتياطيات تستقبل الحالة بشكل فعلي.
  • طلبات العميل تُعالج فقط بواسطة النشطة. العملاء المتصلون بالاحتياطي يتلقون توجيهاً (M) إلى عنوان النشطة ويتحولون إلى هناك.
  • عطل النشطة/إعادة التشغيل → يتم ترقية الاحتياطي ليستمر.
  • الإنهاء الحالي (Ctrl+C) يرسل النشطة الترقية للخليفة أولاً (handoff)، ثم يعيد توجيه العملاء، مما يقلل المدة دون نشطة.
  • الخفض التلقائي: إذا أصبحت عقدتان نشطتين في نفس الوقت بسبب partition في الشبكة، ستكتشف الأولوية الأقل الأخرى وتنسحب تلقائياً إلى وضع احتياطي (منع split-brain دائم).

هذا أسلوب الترقية ليس قائماً على quorum (التصويت بالأغلبية). لذا العدد الفردي/الزوجي لا يُهم، وحتى إذا عاشت عقدة واحدة فقط، تستمر الخدمة.

عدد الخوادمبدون توقفتحمل الأعطال المتزامنةملاحظة
1الأسرع. توقف قصير عند إعادة التشغيل
21الحد الأدنى للتكوين بدون توقف. كافٍ لمعظم الحالات
32الحفاظ على التكرار حتى أثناء صيانة عقدة واحدة
4+N−1زيادة تكلفة النشر فقط — غير موصى به

ما يجب معرفته عن الاتساق

لأن الترقية القائمة على الأولويات ليست إجماعاً، في لحظة network partition قد تصبح كلا الطرفين نشطيْن مؤقتاً، وبسبب طبيعة النسخ غير المتزامن، قد تضيع بعض المنح عند failover. أي في فترات failover/partition، الاستبعاد المتبادل ليس مضموناً بنسبة 100%. إذا كان تحتاج ضمانات قوية، طبّق التحقق من رمز الحماية الذي وصفناه سابقاً على مستوى المورد المحمي — برفض الرموز القديمة (الصغيرة)، حتى لو لم يكن خادم القفل متسقاً بشكل مثالي، يبقى آمناً.