الخلاصة

  • وصف David Cheriton في RFC 1045 الصادر في فبراير 1988 بروتوكول VMTP التجريبي لمعاملات الطلب والرد، ومنها استدعاء الإجراءات عن بعد. يحدد العميل ورقم المعاملة ذي 32 بت وعدّاد الإحالة الطلب، ويحتفظ الخادم بحالة تكشف نسخه المكررة.
  • عند وسم الرد بأنه قابل لإعادة التنفيذ، يرسل العميل الطلب ثانية بعد ضياع الرد، فيعيد الخادم العمل وينتج إجابة جديدة. أما النتيجة التي يلزم إبقاؤها كما هي فيحفظ الخادم نسختها أو ينتظر الإقرار. سؤال الوقت مثال لطيف: المحاولة الجديدة قد تكون أدق من الورقة القديمة.

زر «حاول مجدداً» يخفي سؤالاً محرجاً: ماذا فعل الخادم في المحاولة الأولى؟ في RFC 1045 صمم David Cheriton بروتوكول Versatile Message Transaction Protocol لطلبات تنتظر ردوداً فوق خدمة مخططات بيانات قد تفقد الحزم. استدعاء إجراء على جهاز بعيد أحد أمثلته. قد يكون الخادم أنجز العمل، ثم اختفى الجواب قبل أن يراه العميل. حين يعود الطلب، يحتاج الخادم إلى التعرف على الزائر قبل فتح الملف من جديد.

لذلك يحمل كل ملف ثلاثة إحداثيات داخل نطاق كيان واحد: Client وTransaction وForwardCount. يبدأ رقم المعاملة، وهو 32 بت، بقيمة عشوائية عند إنشاء العميل ثم يزيد عادة بعد كل معاملة. عدّاد الإحالة ذو أربعة بتات يبقى صفراً ما لم يُنقل الطلب إلى خادم آخر. يحتفظ الخادم بسجل حالة لكل عميل، ويستبعد الطلب الذي يحمل الإحداثيات نفسها بوصفه نسخة مكررة. الأرقام هنا تمنع أن يتحول ضياع ورقة الرد إلى إنجاز العمل مرتين.

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

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

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

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

نكتة الساعة سهلة: من يحفظ إجابة قديمة بإتقان قد يقدم معلومة أسوأ ممن يسأل ثانية. لكن الخطأ في تصنيف عمل يغيّر الواقع يجعل المزحة باهظة. حفظ VMTP هوية المعاملة وحدود سجلها وآخر طلب مسموح بإعادته. وعلى التطبيق أن يعرف طبيعة عمله. هذه هي القيمة التاريخية لمسودة البروتوكول التجريبية: حولت الرد الضائع إلى سؤال واضح عن المسؤول عن النسخة والمسؤول عن إعادة العمل.