تخطَّ إلى المحتوى
ENع
تحديد موعد مكالمة
كل الأدلة
التكامل8 دقيقة قراءة

الكتابة المؤجلة المتجانسة

في مكان ما ضمن نظامكم، ستتم محاولة الكتابة مرتين. قد يتم إنهاء عمل أحد العمال بين استدعاء واجهة برمجة التطبيقات (⁦API⁩) وتلقي الإقرار، أو قد تقوم قائمة الانتظار بإعادة التسليم، أو قد ينقر شخص ما مرتين. هذه ليست حالة استثنائية، بل هي حدث أسبوعي، وفي مجال التمويل، هي الحالة التي تؤدي إلى إنهاء المشروع.

من أين يأتي النسخة المكررة

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

  1. يُنهى العامل بعد نجاح طلب ⁦POST⁩ وقبل قراءة الاستجابة. والتوسّع التلقائي يفعل ذلك بشكل روتيني.
  2. تقوم قائمة الانتظار بإعادة التسليم لأن مهلة الرؤية قد انتهت أثناء بطء المكالمة.
  3. تُرجع عملية المعالجة النهائية رمز خطأ 500 بعد أن تكون قد طبقت التغيير بالفعل، وهو أمر أكثر شيوعًا مما تعترف به الوثائق.
  4. يقوم مشغل حسن النية بإعادة تشغيل دفعة فاشلة.

المفتاح يكمن في التصميم بأكمله

كل شيء يعتمد على مفتاح مستمد من العمل نفسه، وليس من المحاولة. فإذا تم إنشاؤه لكل محاولة، فإنه يصبح عديم الفائدة.

جيد
تجزئة تتألف من معرّف المستند المصدر، والسجل الهدف، والعملية. ينتج عن نفس العملية دائمًا نفس المفتاح، بغض النظر عن العامل الذي يقوم بها، وفي أي محاولة إعادة.
سيئ
مُعرف ⁦UUID⁩ يتم إنشاؤه عند بدء المهمة. كل محاولة إعادة هي مفتاح جديد، وكل محاولة إعادة هي عملية نشر جديدة.
سيئ أيضًا
طابع زمني، أو معرّف رسالة في قائمة الانتظار، أو أي عنصر يتغير عند إعادة تسليم الرسالة.

ضع المفتاح في المكون الأولي، حيث يبدأ العمل، وليس في الخطوة التي تقوم بالكتابة. فبحلول الوقت الذي تصل فيه إلى الخطوة الثالثة، يكون قد فات الأوان لاستخلاصه من أي عنصر ثابت.

ثلاث طرق لتطبيقه

  1. الأفضل: تقبل الوحدة النهائية مفتاح الإيدمبوتنس وتقوم بالمهمة نيابة عنك. وهذا ما تفعله العديد من واجهات برمجة التطبيقات الحديثة. ما عليك سوى إرساله وتسجيل النتيجة التي تم إرجاعها.
  2. التالي: قيد فريد في النظام المستهدف على حقل تتحكم فيه. ترفض قاعدة البيانات عملية الكتابة الثانية، ويُعتبر انتهاك القيد نجاحًا وليس خطأً. تعامل معه على أنه نجاح.
  3. أخيرًا: دفتر الأستاذ الخاص بك. قبل الكتابة، قم بإدراج المفتاح في جدول يحتوي على فهرس فريد؛ وإذا فشل الإدراج، فهذا يعني أن المهمة قد تمت بالفعل. قم بتثبيت صف دفتر الأستاذ والكتابة في نفس المعاملة حيثما أمكن ذلك، وحيثما تعذر ذلك، اكتب في دفتر الأستاذ أولاً ثم قم بالتسوية.

يوجد عيب حقيقي في الخيار الثالث: يتم كتابة السجل، لكن عملية الكتابة في المرحلة التالية تفشل. يتم الآن اعتبار العملية منتهية، في حين أنها لم تنتهِ فعليًّا. ولهذا السبب، فإن مهمة التسوية المذكورة في القسم التالي ليست اختيارية.

تسوية الأمر، لأن الفجوة حقيقية

مهما فعلت، سيكون هناك دائمًا عدد قليل من السجلات التي ستصبح في حالة تباين بين نظامك والجهة التالية في السلسلة. وتستغرق المهمة اليومية التي تكتشف هذه السجلات بعد ظهر يوم كامل، وهي الفارق بين التباين الذي تقوم أنت بإصلاحه والتباين الذي يكتشفه العميل.

  1. قارن مخزن قراراتك مع البيانات اللاحقة خلال الـ 48 ساعة الماضية، باستخدام مفتاح الإيدمبوتنتية كمفتاح البحث.
  2. الإبلاغ عن كلا الاتجاهين: تم وضع علامة «تم» عليه لكنه غير موجود في اتجاه مجرى النهر، وموجود في اتجاه مجرى النهر لكن لم يتم تسجيله هنا.
  3. يمكنك إصلاح المشكلة الأولى تلقائيًا عن طريق إعادة المحاولة؛ فالمفتاح يضمن سلامة هذه العملية. أما المشكلة الثانية، فيجب إحالتها إلى أحد الموظفين، لأنها عادةً ما تعني حدوث عملية كتابة لم تقم أنت بإجرائها.
  4. يجب الانتباه إلى العدد الإجمالي، وليس إلى الصفوف الفردية. إن تسجيل حالة أو حالتين يوميًا بشكل ثابت يعني أن النظام يعمل بشكل سليم. أما أربعون حالة فهي تعتبر حادثة.

تتضمن كل عملية إعادة كتابة نقوم بها في بيئة الإنتاج هذه المهمة. وقد اكتشفت هذه المهمة خطأً في تكوين قائمة الانتظار، ورفضًا صامتًا لحقل ما من قبل أحد المعالجات اللاحقة، وحالة واحدة كانت فيها مهمة مجدولة تابعة لفريق آخر تقوم بالكتابة إلى نفس السجلات.

هل تريد أن ننفّذ هذا معك؟

التدقيق هو هذه المنهجية موجّهة إلى أنظمتك، وفي نهايته خطة بناء مُسعّرة.

تحديد موعد مكالمة
أخبرنا بالرقم الذي تريد نقله.تحديد موعد مكالمة