البيانات الأساسيةالتنسيق

أقفال موزعة

تأكد من أن عاملًا واحدًا فقط يشغّل المهمة في كل مرة، بأقفال تنتهي صلاحيتها تلقائيًا ويحررها مالكها بأمان.

أمر للحصول على القفل
1
أمر للتحرير الآمن
1
سكربتات Lua
0
الخطوة 1 من 5
العامل A يأخذ القفل

يأخذه NX فقط إذا لم يكن أحد يحمله. ويجعله PX 30000 ينتهي بعد 30 ثانية إذا تعطل A.

جلسة توضيحيةplaying
# العامل A يأخذ القفل
hotkv> SET lock:billing-run tok-a81f NX PX 30000
OK

عرض متحرك بأوامر HotKV حقيقية وردود توضيحية. انقر على أي خطوة للانتقال إليها. تبقى الأوامر والردود بالإنجليزية، تمامًا كما تكتبها وتراها في HotKV.

المشكلة

يجب ألا تعمل مهام cron على عدة أجهزة، ولا عمليات تحصيل المدفوعات، ولا إعادة بناء الذاكرة المؤقتة مرتين في الوقت نفسه. والقفل بلا انتهاء صلاحية يبقى محجوزًا إلى الأبد عندما يتعطل مالكه، وتحرير القفل باستخدام DEL عادي قد يحذف قفل شخص آخر بعد انتهاء صلاحية قفلك.

كيف يتعامل HotKV معها

يحصل SET مع NX وPX على القفل فقط إذا لم يكن أحد يحمله، ويمنحه انتهاء صلاحية كي لا يحتفظ به مالك متعطل إلى الأبد. ويخزّن كل مالك رمزًا عشوائيًا كقيمة. ويحذف DELEX مع IFEQ القفل فقط إذا كان ما زال يحمل رمزك، وهذا هو التحرير الآمن الذي كان يحتاج سابقًا إلى سكربت Lua.

خطوة بخطوة

ما يحدث، أمرًا بأمر

  1. 01

    العامل A يأخذ القفل

    يأخذه NX فقط إذا لم يكن أحد يحمله. ويجعله PX 30000 ينتهي بعد 30 ثانية إذا تعطل A.

    SET lock:billing-run tok-a81f NX PX 30000
  2. 02

    العامل B يُرد

    القفل محجوز، فيحصل B على nil ويتخطى هذه الدورة.

    SET lock:billing-run tok-b22c NX PX 30000
  3. 03

    A ينجز العمل

    عامل واحد فقط يشغّل مهمة الفوترة.

    PTTL lock:billing-run
  4. 04

    حرّر قفلك فقط

    يحذف DELEX المفتاح فقط إذا كانت القيمة ما زالت رمز A.

    DELEX lock:billing-run IFEQ tok-a81f
  5. 05

    الرمز الخاطئ لا يفعل شيئًا

    لو كان A بطيئًا أكثر من اللازم وصار B يحمل القفل الآن، لترك تحرير A قفل B كما هو.

    DELEX lock:billing-run IFEQ tok-stale
أين يناسب

سيناريوهات من الواقع

المهام المجدولة

تعمل مهمة cron نفسها على كل نسخة، ويضمن القفل أن واحدة منها بالضبط تنجز العمل.

المدفوعات

تُنفَّذ عمليات التحصيل والاسترداد على الطلب الواحد بالتتابع فلا تتداخل أبدًا.

الحماية من تدافع الذاكرة المؤقتة

طلب واحد فقط يعيد بناء إدخال مكلف في الذاكرة المؤقتة بينما ينتظر الآخرون أو يقدّمون القيمة القديمة.

مدمج

ما تحصل عليه

الحصول مع انتهاء صلاحية

يأخذ SET NX PX القفل فقط إذا كان حرًا، مع مهلة.

SETNXPX

تحرير آمن

يحذف DELEX IFEQ فقط إذا طابقت القيمة رمزك.

DELEX

التمديد أثناء العمل

تحقق من الوقت المتبقي ومدّده للمهام الطويلة.

PTTLPEXPIRE

المقارنة بالملخص

للقيم الكبيرة، يقارن DELEX IFDEQ ملخصًا بدل القيمة كاملة.

DIGESTIFDEQ
المرجع:SETDELEXDIGEST

أسئلة شائعة

لماذا لا أحذف القفل بـ DEL فقط؟

إذا انتهت صلاحية قفلك وأخذه عامل آخر، فإن DEL العادي سيحذف قفله. أما DELEX IFEQ فلا يحذفه إلا ما دام يحمل رمزك.

كم ينبغي أن تكون مدة الصلاحية؟

أطول مما تستغرقه المهمة عادةً. وللمهام الطويلة، مدّد الصلاحية دوريًا ما دمت تحمل القفل.

هل أحتاج إلى Lua للتحرير الآمن؟

لا. ينفّذ DELEX المقارنة والحذف في أمر واحد.

حالات استخدام ذات صلة

جرّبه على عبء عملك

يتحدث HotKV بروتوكول Redis، لذا يمكنك توجيه عميل موجود إليه وتشغيل هذه الأوامر نفسها.