الطلب الخطير ليس الأول. هو الطلب نفسه يصل مرة أخرى لأن المرسل لم يسمع الإجابة الأولى، أو سمعها وأعاد المحاولة على أي حال. مزودو الدفع يفعلون هذا. الطوابير تفعل هذا. المتصفح يفعل هذا حين يضغط شخص الزر مرتين. إن عامل النظام النسخة الثانية كعمل جديد فستخصمون مرتين، أو تشحنون مرتين، أو تكتبون سطري دفتر لرهان واحد.
افترض النسخة المكررة
أصمم المعالج بحيث يكون التسليم الثاني نجاحاً لا يفعل شيئاً. الأول يؤدي العمل ويخزن مفتاحاً: معرّف حدث المزود، أو مفتاحاً أرسله العميل، فريداً في قاعدة البيانات. الثاني يجد المفتاح ويعيد النتيجة نفسها. لا خصم ثانٍ. لا بريد ثانٍ. لا صف ثانٍ.
قيد التفرد هو الجزء الذي أثق به. فحص في كود التطبيق، قبل الإدراج بلحظة، يخسر السباق حين يستيقظ عاملان معاً. قاعدة البيانات لا تخسر ذلك السباق. الخاسر يتلقى تعارضاً ويحوله إلى «تم بالفعل».
| الوصول الأول | الوصول الثاني | |
|---|---|---|
| بحث | المفتاح جديد | المفتاح مخزّن أصلًا |
| اكتب | صف واحد، أثر جانبي واحد | لا صف جديد |
| رد | مقبول | نفسه المقبول سابقًا |
| إذا ماتت العملية في منتصف الطريق | صندوق الصادر ما زال مدينًا بالرسالة | لا يدين بثانٍ |
الرسالة تخرج مع الكتابة، أو لا تخرج
إرسال البريد، أو رسالة الطابور، داخل الطلب وقبل الالتزام هو كيف تحصلون على رسالة لمعاملة تراجعت. أكتب الرسالة الخارجة في المعاملة نفسها التي فيها صف العمل، وعامل منفصل ينشرها. إن ماتت العملية فالصف والرسالة موجودان معاً أو غائبان معاً. يمكن للعامل إعادة محاولة النشر. يجب ألا يعيد المعالج محاولة الخصم.
الإلغاء قيد جديد، لا تعديل
حين يجب التراجع عن شيء، لا أكتب فوق السطر الأصلي. قيد مقاصّة يقول ما تغيّر ويترك السطر الأول مقروءاً. بعد أسبوع ما زلتم تستطيعون الإجابة عما كان يُعتقد في 14:02. تعديل الصف يجيب فقط عما يُعتقد الآن، وبلا شاهد.
إن كان بإمكان إعادة المحاولة أن تجعل العملية تحدث مرتين، فالعملية لم تنتهِ.
سمِّ المفتاح قبل أن تكتب المعالج
المفتاح ليس «بصمة الطلب كله» إلا إذا تحققتم مما يغيّره المرسل بين المحاولات. مزود دفع سيعيد إرسال معرّف الحدث نفسه مع طابع وقت تسليم جديد. إن كان الطابع داخل المفتاح فالتسليم الثاني يبدو جديداً، وقد بنيتم الخلل الذي أردتم منعه. أستخدم المعرّف الذي يعد المرسل بأنه ثابت. إن لم يعد بواحد، أطلب من المستدعي أن يرسل واحداً، وأرفض النداء الذي يصل من دونه.
ثم أكتب الفشل في المكان نفسه الذي أكتب فيه النجاح. التعارض ليس صفحة خطأ للمرسل. إنه الجواب المتوقع على إعادة المحاولة. ينبغي أن يستطيع المرسل التوقف. إن أجبت بـ 500 فسيحاول مرة ثالثة ورابعة، ويصير الحادث طابور عمل متطابق.
لا أعتبر هذا منتهياً لأن المسار السعيد أعاد 200. الاختبار يرسل الحمولة نفسها مرة أخرى ويؤكد أثراً جانبياً واحداً. ثم يقتل العامل بين الالتزام والنشر ويؤكد أن الرسالة ما زالت تخرج، مرة واحدة. هذان الاختباران أقصر من الحادث الذي يحلان محله. أبدأ من هناك.
