الخلاصة
- يمكن أن تجتمع النتيجة العامة FAILED مع عمليات ناجحة على سجلات منفردة. في المثال الرسمي ذي العناصر الخمسة، تغير ثلاث عمليات البيانات، وتنجح واحدة بلا تغيير، ويفشل تعديل واحد.
- إغلاق اتصال HTTP لا يلغي بمفرده المعالجة على الخادم. غياب الرد يترك النتيجة غير مؤكدة لدى المرسل، ولا يثبت أن شيئا لم يتغير.
- تختلف الإشعارات بحسب السجلات والمستلمين. الاستدراك المتناسب يبدأ بمقارنة النتائج الفردية مع التحقق المسموح به، لا بإعادة إرسال المجموعة كلها بناء على كلمة واحدة.
نتيجة واحدة لا تحكي كل العملية
حين توصف مهمة بأنها فشلت، يكون السؤال الطبيعي: كيف نعيد تنفيذها؟ لكنه يأتي بعد سؤال ينبغي ألا يضيع: ما الذي نفذ منها بالفعل؟ في تحديث يشمل عدة سجلات من قاعدة RIPE، لا تعني خسارة النتيجة الكاملة بقاء جميع الأجزاء في حالتها القديمة. وقد يكون افتراض ذلك هو أول خطأ في المحاولة الثانية.
يعرض دليل الرد على طلبات التحديث مثالا بسيطا في حسابه ودقيقا في دلالته. تتعرف المنظومة على خمسة عناصر. تسجل أربع عمليات ناجحة: إنشاء عنصر واحد، وتعديل عنصرين، وعملية NOOP لا تغير شيئا لأن المحتوى المرسل يطابق المحتوى المحفوظ. ويفشل تعديل آخر.
إذن، عدد التغييرات الفعلية ثلاثة، لا أربعة. وعددها ليس صفرا أيضا. العملية الناجحة التي لم تغير البيانات تؤكد أن الحالة المطلوبة موجودة أصلا. أما الفشل الواحد فلا يمحو النجاحات الأخرى. وتوضح الصفحة، في شرحها المنفصل لنتيجة الرد بصيغة البريد الإلكتروني، أن وجود خطأ واحد يكفي لإعطاء النتيجة العامة FAILED.
هذا مثال توثيقي، وليس حادثة عثرنا عليها في تشغيل حقيقي. كما لا نجمع المثال المنفصل لعنوان الرسالة مع جدول النتائج لنقدمهما بوصفهما رسالة فعلية التقطناها. ما تثبته الوثائق هو اختلاف مستوى الحكم: النتيجة العامة تخص الرسالة، والنتائج التفصيلية تخص العمليات على عناصرها.
يظهر أثر هذا الاختلاف عند تسليم العمل بين شخصين. في سيناريو افتراضي، يترك أحدهما ملاحظة «فشل التحديث»، فيفهم الآخر أن بإمكانه البدء من الحالة القديمة. قد تكون بعض السجلات قد تجاوزت تلك الحالة. وفي المقابل، الاكتفاء بعد العمليات الناجحة قد يخفي الجزء الذي لم يكتمل من غرض المنظمة. لا يكفي أي من الاختصارين وحده لتقرير الخطوة التالية.
لماذا تعالج العناصر منفصلة؟
تشرح صفحة معالجة العناصر أن فشل عنصر لا يوقف تلقائيا جميع العناصر التالية. تتم المعالجة على مستوى العنصر. جمع العمليات في رسالة واحدة لا يجعلها، بمجرد الجمع، معاملة غير قابلة للتجزئة تنجح كلها أو تلغى كلها.
لكن المعالجة المنفصلة لا تعني انعدام التبعيات. إذا تعذر إنشاء عنصر يحتاج إليه عنصر لاحق، فقد يفشل الأخير عند التحقق من سلامة المراجع. ويمكن لمراجع AUTO-n أن تؤثر في ترتيب المعالجة. لذلك لا يصح تصوير الأمر على أنه ترتيب نصي جامد في كل الحالات، ولا على أنه حل آلي لأي علاقة تبعية يتخيلها المرسل.
لنفترض أن مؤسسة تريد إنشاء عنصر مرجعي وتعديل عدة سجلات أخرى. يرفض الإنشاء، بينما يقبل تعديل لا يعتمد عليه. غرض المؤسسة لم يكتمل، إلا أن قاعدة البيانات تغيرت جزئيا. المطلوب الآن هو فصل ما يعتمد على العنصر المرفوض عما لا يعتمد عليه، وتحديد ما أصبح مطابقا للغرض. هذا تصوير مشروط لآلية العمل، لا دليل على وقوع خسارة لدى مشغل بعينه.
ثمة حجة وجيهة لمصلحة هذا التصميم. ليس من الضروري أن تمنع صياغة خاطئة أو صلاحية غير كافية في عنصر واحد كل أعمال الصيانة الصحيحة وغير المرتبطة به. يبقى للتحقق من الصلاحيات وسلامة المراجع معنى عند كل عنصر، ولو أرسلت العناصر معا. والنجاح بلا تغيير ليس نجاحا زائفا: إذا كانت الحالة المطلوبة قائمة بالفعل، فلا حاجة إلى تعديل لمجرد تسجيل حركة.
لهذا لا يكون فرض الإلغاء الشامل تحسينا بديهيا لكل استخدام. بعض الأغراض تحتاج فعلا إلى تنفيذ غير قابل للتجزئة، وبعضها يستفيد من استقلال العمليات الصحيحة. تبدأ المشكلة حين يفترض برنامج العميل ضمانة لا يوفرها المسار الذي اختاره. قد يكون للمؤسسة مشروع واحد، لكن حدود المشروع ليست بالضرورة حدود المعالجة في قاعدة البيانات.
الرد التفصيلي الموجود يميز بالفعل بين العمليات الفاشلة والناجحة والفقرات التي لم يتعرف إليها. ولذلك لا يدور السؤال حول اختراع سلطة مركزية أخرى توافق على كل تحديث. السؤال الأقرب هو: هل يحفظ العميل هذه التفاصيل ويعرضها لمن يقرر الاستدراك، أم يختزلها في ضوء أحمر ثم يترك الفريق يعيد اكتشافها؟
انقطاع الاتصال ليس أمرا بإيقاف الخادم
تضيف طبقة النقل تمييزا آخر. في Syncupdates، توضح الوثائق أن HTTP 200 قد يصاحب طلبا عولج مع وجود أخطاء في عناصره. قراءة الرمز لا تغني عن قراءة مضمون الرد. ولا ينبغي تعميم هذه الملاحظة على كل واجهات HTTP لدى RIPE NCC؛ إنها تخص السلوك الموصوف لذلك المسار.
أما إذا لم يصل الرد أصلا، فالموقف مختلف. يشرح دليل Syncupdates ووصف معالجة العناصر أن إغلاق الاتصال لا يوقف بمفرده العمل على الخادم. يمكن أن تستمر المعالجة إلى نهايتها، بينما يتعذر إعادة الرد عبر الاتصال المغلق.
الوصول إلى النهاية لا يعني قبول كل العمليات. قد تنتهي عملية التقييم بنتائج مختلطة. لكن المرسل الذي فقد الرد لا يعرف هذه النتائج. ومن ثم، فإن التصنيف الصحيح لديه يبدأ من «غير مؤكد»، لا من «مرفوض كله» أو «مقبول كله». الصمت ليس موافقة، وليس دليلا على أن قاعدة البيانات ظلت ساكنة.
هنا تكمن محدودية قاعدة آلية تبدو مريحة: إعادة كل شيء عند انتهاء مهلة الاتصال. قد يكون بعض ما يعاد قد نفذ، وقد يكون بعضه رفض، وقد لا تكون الحالة معروفة بعد. لا تقدم المهلة المنتهية وحدها جوابا عن أي عنصر بعينه. هذه فجوة معرفة ينبغي التعامل معها كما هي قبل الانتقال إلى إجراء جديد.
حتى تغيير الواجهة لا يمنح تلقائيا تنفيذ المجموعة كوحدة واحدة. يدعم Syncupdates عدة عناصر في رسالة، بينما تقدم واجهة REST عمليات على عناصر منفردة ونموذج ردود XML أو JSON. لا تتحول عدة طلبات REST مستقلة إلى معاملة ذرية لمجرد أن التطبيق يربطها بمهمة واحدة. يظل على المؤسسة أن تتابع ما آل إليه غرضها الذي يشمل عدة سجلات.
لم نتسبب في انقطاع اتصال أو نرسل تحديثا حقيقيا لاختبار هذه النقطة. ولا تقدم المقالة قياسا لمدة التنفيذ أو تكرار الأخطاء. الاستنتاج أضيق: ما دام الخادم قد يواصل المعالجة، فلا يجوز استخدام نهاية الاتصال بديلا عن نتائج العمليات.
لكل مستلم نافذة مختلفة
قد يصل إشعار بالبريد فيبدو وكأنه يؤكد أن المهمة انتهت. غير أن قواعد الإشعارات تربط المستلمين بخصائص العناصر ومراجعها. يمكن أن يرى مستلمان مجموعتين مختلفتين. البريد الذي يصل إلى شخص ليس بالضرورة كشفا شاملا بما حاول شخص آخر تنفيذه.
عند التعديل، تستخدم عناوين notify الموجودة في العنصر القديم. وقد تؤدي خصائص أو مراجع أخرى إلى مستلمين إضافيين. لا يبرر ذلك الادعاء الأوسع بأن عنوانا جديدا يستحيل أن تصله رسالة عبر أي مسار آخر. المقصود أن نطاق الإشعار يتبع العلاقات الموثقة للعنصر، لا تصور المرسل للمهمة بكاملها.
ويختلف سبب الإرسال أيضا. الإشعار العادي بنجاح تغيير ليس هو رسالة upd-to المرتبطة بفشل المصادقة. وصول أحدهما لا يثبت نجاح كل العمليات، وغياب رسالة عن صندوق معين لا يثبت غياب كل التغييرات. لم نفحص تسليم البريد في هذه الدراسة؛ نحن نحدد حدود ما يمكن الاستنتاج من تصميم الإشعار نفسه.
حتى جمع إفادات عدة مستلمين لا يكفي تلقائيا لإثبات شمول جميع العناصر. ربما توجد عناصر لا تقع ضمن ما وصل إلى أي منهم. الرد إلى صاحب الطلب، والإشعار إلى طرف آخر، والقراءة اللاحقة المصرح بها، ملاحظات مختلفة. الحفاظ على مصدر كل ملاحظة ونطاقها أنفع من دمجها في نتيجة واحدة تتجاوز ما تدعمه.
استدراك يبدأ من المعروف
يمكن تنظيم العمل من دون ابتكار جهاز إداري جديد. لكل عنصر مقصود، تميز المؤسسة بين تغيير مؤكد، ورفض صريح، ونجاح بلا تغيير، ونتيجة لم تؤكد بعد. ثم تربط ذلك بالعملية الأصلية والوقت والواجهة المستخدمة والتحقق اللاحق المسموح به. هذه ممارسة نقترحها انطلاقا من الوصف الرسمي، وليست صيغة جديدة فرضتها RIPE NCC.
والقراءة اللاحقة تحتاج إلى تفسير. تميز وثائق REST بين الاستجابة للتحديث وظهور أثره لاحقا في الاستعلام والبحث. رؤية نسخة قديمة مباشرة بعد الطلب لا تثبت، وحدها، التراجع عن التغيير. لا يوجد في هذه المقالة زمن انتظار مقاس يمكن ضمانه، ولا مبرر للتوصية باستعلامات متلاحقة بسرعة. إذا ظلت الملاحظة غير حاسمة، ينبغي أن يظل هذا القيد ظاهرا.
أما dry-run، فيفحص الصياغة وقواعد العمل والتفويض وسلامة المراجع من دون حفظ التغييرات. يعيد نتيجة الفحص بدلا من إرسال إشعارات التغيير العادية. إنه وسيلة تحقق نافعة، لكنه لا يحجز الحالة المستقبلية. نجاحه لا يثبت ما ستفعله محاولة كتابة لاحقة، ولا يحول مجموعة العناصر إلى معاملة لا تتجزأ. لم ننفذ dry-run على قاعدة RIPE من أجل هذا المقال.
ويمكن أن تساعد البيانات التاريخية في مراجعة نسخ سابقة من العناصر، لكن البيانات الشخصية التاريخية غير متاحة. هذا حد للاسترجاع، لا دليل على غياب سجلات داخلية. كما لا يمنح حق نسخ جهات الاتصال أو الأسرار إلى تقرير مفتوح. تحفظ الردود الأصلية ضمن وصول مقيد، وتقتصر الملخصات التشغيلية على ما يحتاجه القرار.
ولا ينبغي المبالغة في الاتجاه المعاكس والقول إن كل إعادة محاولة مؤذية. إذا بقي العنصر مطابقا للحالة المطلوبة، وظلت الصلاحية نافذة، فقد تنتهي إعادته بلا تغيير. لكن لا يصح تعميم هذه الإمكانية على مجموعة لم يتضح مصيرها. كلمة FAILED تفتح باب التحقق؛ لا تأمر بإلغاء كل شيء أو إعادة كل شيء أو توسيع صلاحيات العميل. القرار التالي يجب أن يستند إلى ما نعرفه عن كل عنصر، لا إلى المعنى الذي نتمناه لعنوان الرسالة.
المصادر
إحاطة الأعضاء
سياق أعمق للملف الشخصي
سجّل الدخول بمستوى العضوية المناسب لفتح الإحاطة الكاملة وملاحظات المصادر.
للدائرة الاستراتيجية فقط
الدائرة الاستراتيجية
مفتوح لجميع القراء. افتح إحاطات الملف الشخصي بعد الانضمام وتسجيل الدخول.
انضم إلى الدائرة الاستراتيجيةلأعضاء تحالف القيادات فقط
تحالف القيادات
لأصحاب الأصول الفكرية المؤهلين وللإدارة؛ سجّل الدخول للوصول إلى إحاطات التحالف.
انضم إلى تحالف القيادات
