7 دقيقة

التراجع التلقائي عن الآثار الجانبية للوكيل

لا يستطيع التراجع التلقائي عن الآثار الجانبية للوكيل إلغاء كل إجراء خارجي. تعرّف إلى حدود اللقطات ومتى تبدأ الحاجة إلى الموافقة أو التعويض.

التراجع التلقائي عن الآثار الجانبية للوكيل

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

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

للتراجع أربعة معان منفصلة

لا يفيد التراجع إلا عندما تسمي المجموعة الحالة التي سيستعيدها والحالة التي لا يستطيع لمسها. غالبا ما تخفي الكلمة أربع آليات بضمانات مختلفة جدا.

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

يسجل Git revert التزاما جديدا تعكس تغييراته التزاما سابقا. وهو يصلح تاريخ المصدر من دون حذف ذلك التاريخ. ولا يتصل بالخدمات التي استدعتها الشفرة القديمة أثناء عملها.

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

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

أستخدم جدول ملكية الأثر في مراجعات التصميم لأنه يفرض إجابات دقيقة:

التغييرمالك الاستعادةالآلية المعتادةهل يمكن محو الأثر الأصلي؟
الشفرة المصدرية المنشأةالتطبيق أو المستودعاستعادة لقطة أو Git revertغالبا، للتنفيذات المستقبلية
الصفوف المثبتةمشغل قاعدة البياناتتصحيح منطقي أو استعادةأحيانا محليا
بريد إلكتروني تم تسليمهمزود البريد والمستلممتابعة أو إيقاف البريد المعلقلا
دفعة تم تحصيلهامعالج الدفعإلغاء أو استردادلا
طلب API خارجيالخدمة المستقبلةإلغاء أو تعويض خاص بالمزودغالبا لا

العمود الأخير هو الأهم. العملية العكسية ليست دليلا على اختفاء الأثر الأصلي. فقد تبقى سجلات التدقيق ونسخ المستلمين وقيود التسوية وwebhooks والعمل المادي.

تراجع الشفرة يغير البرنامج، لا الماضي

يمنع تراجع الشفرة السلوك المستقبلي أو يغيره، ولا يعكس السلوك الذي تسبب به الإصدار القديم بالفعل. وينطبق ذلك سواء استخدمت المجموعة Git أو لقطة منصة أو تراجعا في النشر.

تصف وثائق Git الأمر git revert بأنه يسجل التزامات تعكس التغييرات التي أدخلتها التزامات سابقة. هذه الصياغة دقيقة: يطبق Git رقعة عكسية على محتوى المستودع. ولا يعرف Git شيئا عن رسائل البريد أو المدفوعات أو موارد السحابة أو تذاكر الدعم أو واجهات API للشركاء التي أنشأها الالتزام المتراجع عنه أثناء تشغيله.

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

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

قبل التراجع، احتفظ بالأدلة التشغيلية التي أنتجها الإصدار القديم:

  • معرف النشر والتزام المصدر
  • معرفا تشغيل الوكيل والنية
  • معرفات رسائل قائمة الانتظار وحالة التأجير
  • معرفات الطلبات الخارجية
  • استجابات المزود والطوابع الزمنية

بعد ذلك أوقف التنفيذ الجديد، وطابق العمليات غير المكتملة، ثم استعد الشفرة. التراجع أولا وطرح الأسئلة لاحقا غالبا ما يدمر أسهل طريق لفهم الآثار التي تجاوزت الحدود.

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

لاستعادة قاعدة البيانات مهمة أضيق مما يفترض الناس

تعيد استعادة قاعدة البيانات حالة قاعدة البيانات، لا واقع العمل عبر كل المشاركين في المعاملة. قد تكون المعاملة ذرية داخل قاعدة بيانات واحدة، بينما تبقى العملية المحيطة موزعة على عدة أنظمة.

تأمل هذا التسلسل:

  1. يدرج الوكيل صف فاتورة.
  2. يستدعي API للدفع.
  3. يقبل المعالج عملية الخصم.
  4. يفشل تثبيت قاعدة البيانات.

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

لا يحل عكس الترتيب المشكلة. إذا ثبت التطبيق الفاتورة أولا ثم فشل استدعاء الدفع، تحتوي قاعدة البيانات على فاتورة غير مدفوعة. هذه الحالة أسهل للفحص، لكن التطبيق ما زال يحتاج إلى آلة حالات تميز بين payment_pending وpayment_confirmed وpayment_failed وpayment_unknown.

تشرح وثائق PostgreSQL الاستعادة إلى نقطة زمنية بأنها استعادة نسخة احتياطية أساسية وإعادة تشغيل سجلات write ahead log حتى هدف استعادة مختار. هذا إجراء للمشغل لاستعادة مجموعة قاعدة بيانات. وليس إلغاء انتقائيا لتشغيل وكيل واحد، ولا يستطيع أن يطلب من معالج دفع أو خدمة بريد العودة إلى الطابع الزمني نفسه.

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

يقلل نمط صندوق الصادر فجوة خطرة واحدة. يثبت التطبيق تغيير العمل ونية الأثر في المعاملة المحلية نفسها:

BEGIN;

INSERT INTO invoices (invoice_id, customer_id, status)
VALUES ('inv_2048', 'cust_91', 'payment_pending');

INSERT INTO effect_intents
  (intent_id, operation, subject_id, status)
VALUES
  ('eff_7f31', 'capture_payment', 'inv_2048', 'pending');

COMMIT;

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

تحتاج الإجراءات الخارجية إلى تعويضات، وبعضها بلا تعويض

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

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

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

تتعاون واجهات API أخرى بدرجة أقل. قد يطلب استدعاء مخزونا أو يوفر بنية تحتية أو ينشر محتوى أو يمنح صلاحية أو يرسل طردا أو يدفع شخصا لبدء عمل. وجود نقطة نهاية DELETE لا يثبت إمكانية العكس. فقد يترك حذف مورد سجلات تدقيق أو بيانات منسوخة أو إشعارات أو موارد تابعة أو عواقب مادية.

صنف التعويض وفق ما يستطيع تحقيقه بصدق:

  • العكس المحلي الدقيق يعيد الحالة المتحكم بها إلى قيمتها السابقة.
  • إلغاء المزود يوقف عملا لم يكتمل.
  • التعويض المالي ينشئ استردادا أو رصيدا.
  • التواصل التصحيحي يقر بأن الرسالة الأولى ما زالت ظاهرة.
  • المعالجة اليدوية تتعامل مع آثار لا يمكن أن يستوعب سياقها قاعدة آمنة مؤتمتة.

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

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

عدم التكرارية توقف التكرار لكنها لا تعكس النجاح

انشر النسخة المصححة
انشر النسخة التي تم إصلاحها باستخدام Koder.ai، من دون الخلط بين تغيير النشر وعكس استدعاءات API المكتملة.

تحمي عدم التكرارية عمليات إعادة المحاولة من إنتاج آثار مقصودة مكررة، لكنها لا تلغي أول أثر ناجح. كثيرا ما تطمس الفرق الفرق بين الفكرتين ثم تكتشفه بعد مهلة.

يعرّف RFC 9110 طريقة طلب غير تكرارية بأن الأثر المقصود لعدة طلبات متطابقة هو نفسه أثر طلب واحد منها. ويصنف PUT وDELETE والطرق الآمنة بأنها غير تكرارية على مستوى دلالات البروتوكول. أما POST فليس غير تكراري عموما، رغم أن API يمكنها إضافة سلوك عدم التكرارية عبر عقدها الخاص.

هذا القيد مهم. يمكن أن ينشئ DELETE غير تكراري سجل أو مقياسا أو استجابة جديدة في كل مرة. وقد تنتهي سجلات تطبيق المزود لعدم التكرارية، أو تقصر المعرفات على حساب واحد، أو ترفض الوسائط المتغيرة، أو تخزن نتائج مختارة فقط. اقرأ عقد المزود بدلا من استنتاج الضمانات من فعل HTTP.

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

المهلة تنشئ نتيجة غير معروفة، لا فشلا. استخدم هذا التسلسل:

  1. علّم المحاولة outcome_unknown، ولا تنشئ نية بديلة.
  2. استعلم من المزود باستخدام قيمة عدم التكرارية أو مرجع العملية.
  3. إذا أكد المزود النجاح، سجل النجاح محليا.
  4. إذا أكد عدم وجود عملية، أعد المحاولة بالقيمة نفسها.
  5. إذا لم يستطع الإجابة، أوقف العملية للمطابقة أو المراجعة البشرية.

يوفر شكل الاستجابة هذا للوكيل معلومات كافية لتمييز القبول عن عدم يقين النقل:

{
  "intent_id": "eff_7f31",
  "attempt": 2,
  "idempotency_key": "eff_7f31",
  "transport_status": "timeout",
  "provider_status": "unknown",
  "provider_reference": null,
  "next_action": "reconcile"
}

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

مكان الموافقة هو عند حد الأثر

يجب أن تحدث الموافقة بعد أن يشكل الوكيل الإجراء الخارجي الدقيق وقبل مغادرة أول طلب لا رجعة فيه للنظام. موافقة في بداية مهمة واسعة تمنح الوكيل مجالا كبيرا لتغيير المستلمين أو المبالغ أو النطاقات أو الأدوات لاحقا.

عبارة «تعامل مع حساب هذا العميل» ليست موافقة كافية لخصم بطاقة أو إرسال بريد إلى كل مستخدم. تصف الموافقة الصحيحة العملية الملموسة: المستلم، والمبلغ والعملة، وملخص الرسالة أو الحمولة، والحساب المستهدف، والأداة، وانتهاء الصلاحية، وعدد المحاولات المسموح بها. إذا تغير أي حقل معتمد، لا تعود الموافقة مطابقة.

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

اطلب موافقة صريحة للإجراءات التي:

  • تنقل المال أو تنشئ التزاما ماليا
  • ترسل معلومات إلى شخص أو مؤسسة خارجية
  • تنشر البيانات أو تحذفها أو تكشفها خارج تخزين متحكم به
  • تغير الهوية أو الوصول أو الملكية أو إعدادات الأمان
  • تبدأ عملا ماديا أو عملية أخرى لا يمكن استدعاؤها بصورة موثوقة

قد تستخدم الإجراءات المتكررة منخفضة العواقب موافقة دائمة محددة. ينبغي أن يسمي الحد أقصى للمبلغ ومجموعة المستلمين والأداة المسموحة ووقت انتهاء الصلاحية والمعدل والعدد الإجمالي للعمليات. عبارة «موافق عليه للفوترة» بلا حد قابل للتنفيذ.

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

ينبغي أن تعرض شاشة الموافقة حقيقة الاستعادة بلغة عادية. عبارة «لا يمكن استدعاء هذه الرسالة بعد تسليمها» مفيدة. أما عبارة «هذه العملية قابلة للعكس» فمضللة حين تكون الاستعادة الفعلية استردادا قد يستغرق وقتا ويبقى في الكشوف المالية.

ينبغي أن تكشف عقود الأدوات دورة حياة الأثر كاملة

خطط للتغييرات المحفوفة بالمخاطر مبكرا
خطط للتغيير في Koder.ai قبل إنشائه، لتكون حدود التطبيق واضحة قبل النشر.

ينبغي أن يصف عقد أداة الوكيل النية والتنفيذ والملاحظة والتعويض كعمليات منفصلة. دالة واحدة تنفذ أثرا وتعيد success: true تترك أدلة قليلة جدا لإعادة المحاولة أو الموافقات أو الاستجابة للحوادث.

جزء السياسة التالي صغير بما يكفي للتنفيذ ومحدد بما يكفي للمراجعة:

tools:
  send_email:
    effect: irreversible
    approval: required
    idempotency_field: intent_id
    evidence_field: provider_message_id
    compensation: null

  capture_payment:
    effect: compensatable
    approval: required
    idempotency_field: intent_id
    evidence_field: provider_payment_id
    compensation: refund_payment

  update_draft:
    effect: local_reversible
    approval: none
    compensation: restore_version

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

ينبغي أن يقبل التنفيذ غلافا ثابتا:

{
  "intent_id": "eff_7f31",
  "operation": "capture_payment",
  "arguments": {
    "invoice_id": "inv_2048",
    "amount_minor": 12900,
    "currency": "USD"
  },
  "approval": {
    "approval_id": "apr_662",
    "scope_hash": "sha256:8b4f...",
    "expires_at": "2026-07-27T18:00:00Z"
  }
}

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

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

امنح الملاحظة أداتها الخاصة، مثل get_payment_status(intent_id). لا ينبغي أن تنشئ الملاحظة أثرا. يفصلها ذلك كي يتمكن الوكيل من حل النتائج الملتبسة من دون تلقي إذن بإعادة محاولة الإجراء الأصلي.

قد يتجاوز تشغيل فاشل واحد كل حدود الاستعادة

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

قد يترك تشغيل وكيل واحد الشفرة وسجلات قاعدة البيانات والأنظمة الخارجية في نقاط زمنية مختلفة. إن استعراض ذلك الفشل قبل الإطلاق يكشف فجوات تخفيها أداة تراجع عامة.

افترض أن وكيلا ينشئ تطبيقا للعضوية وينشر تغييرا ويستورد قائمة عملاء ويحصّل الرسوم السنوية ويرسل رسائل ترحيب. تبدو المهمة موحدة، لكنها تتجاوز أربعة حدود استعادة على الأقل.

عند 14:00، ينشر الوكيل شفرة تحسب الرسم السنوي من العمود الخطأ. عند 14:02، يكتب 40 نية دفع ومسودات بريد في قاعدة البيانات. عند 14:03، يحصّل عامل عدة مدفوعات. عند 14:04، يقبل مزود البريد رسائل ترحيب تحتوي الرسوم غير الصحيحة. عند 14:05، توقف المراقبة العامل. انتهت مهلة بعض استدعاءات الدفع بعد وصولها إلى المعالج، لذلك لا تكشف الحالة المحلية إن كانت نجحت.

استعادة لقطة الشفرة من 13:59 توقف الحساب الخاطئ في التشغيلات المستقبلية. لكنها لا تغير الرسم المنسوخ في النوايا الموجودة. توثق إعادة التزام Git تصحيح المصدر، لكن لها الحد نفسه.

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

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

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

لا يكتمل التشغيل إلا عندما تصل كل نية إلى حالة نهائية مثل succeeded أو confirmed_failed أو compensated أو manual_exception. عبارة «تم التراجع عن التطبيق» تصف الجزء الأول من الحادثة فقط.

لا تنجح الاستعادة إلا إذا بقيت الأدلة

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

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

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

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

عند استخدام Koder.ai، تعامل مع لقطاته وتراجعه كطبقة استعادة التطبيق، ثم صمم ضوابط منفصلة لتاريخ قاعدة البيانات ولكل إجراء خارجي قد يطلقه التطبيق. يساعد تصدير المصدر وضوابط النشر والتراجع على استعادة البرمجيات، بينما تظل عقود أدوات التطبيق مسؤولة عن الموافقات والتعويض.

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

الأسئلة الشائعة

هل يمكن لتراجع وكيل ذكاء اصطناعي إلغاء إرسال رسالة بريد إلكتروني؟

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

هل يمكن للتراجع التلقائي عكس عملية خصم من بطاقة ائتمان؟

غالبا لا. لا يستطيع التراجع محو دفعة تمت تسويتها من سجلات معالج الدفع، بل يجب أن يصدر النظام استردادا كمعاملة مالية جديدة. وقد يمكن إلغاء تفويض لم يتم تحصيله، لكنه يظل عملية دفع صريحة لا تراجعا برمجيا.

ما الذي يلغي Git revert فعليا؟

ينشئ Git revert التزاما جديدا يطبق عكس تغيير برمجي سابق. لا يعيد صفوف قاعدة البيانات، ولا يلغي طلبات API، ولا يحذف الرسائل التي تم تسليمها، ولا يسترد المدفوعات. تعامل معه كإصلاح لتاريخ المصدر فقط.

هل يلغي تراجع قاعدة البيانات استدعاءات API الخارجية؟

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

هل مفتاح عدم التكرارية هو نفسه التراجع؟

لا. تمنع عدم التكرارية المحاولات المتكررة من إنشاء آثار مكررة عندما يطبقها المزود بشكل صحيح. لكنها لا تلغي أول طلب ناجح ولا تضمن أن طلبا مختلفا بالمعرف نفسه سيكون آمنا.

ما إجراءات الوكيل التي ينبغي أن تتطلب موافقة بشرية؟

اطلب الموافقة حين يمكن للإجراء أن ينشئ تبعات قانونية أو مالية أو متعلقة بالخصوصية أو السمعة أو التشغيل خارج التطبيق. من الأمثلة إرسال الرسائل، وتحصيل المدفوعات، ونشر البيانات، وتغيير الصلاحيات، وتقديم الطلبات، واستدعاء API يبدأ عملا ماديا. لا تحتاج عمليات القراءة والمسودات المحلية عادة إلى البوابة نفسها.

ما الذي ينبغي للوكيل تسجيله قبل استدعاء API خارجي؟

سجل معرف النية، والوسائط الدقيقة، والتفويض، ونطاق الموافقة، وقيمة عدم التكرارية، ورقم المحاولة، ومرجع المزود، وحالة الاستجابة، وحالة التعويض. خزّن السجل قبل التنفيذ وحدّثه بعد كل محاولة. يسهل فقدان سجلات التطبيق وحدها أثناء التراجع الذي تحقق فيه.

كيف يمكن للوكيل إعادة محاولة طلب انتهت مهلته بأمان؟

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

متى ينبغي تنفيذ إجراء تعويضي تلقائيا؟

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

كيف تختبر سلامة التراجع في أدوات الوكيل؟

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

Related posts