الإطار الخاطئ: زر التراجع
يفترض طلب "إضافة زر تراجع" إلى وكيل نموذجًا لا يصمد. فهو يفترض معاملة واحدة قابلة للعكس، بالطريقة التي يتعامل بها محرر النصوص مع ضغطة مفتاح. تشغيل الوكيل ليس معاملة. إنه سلسلة من الكتابات غير المتجانسة عبر أنظمة ذات نماذج اتساق مختلفة: صف يُدرج في قاعدة بيانات، ورسالة تُنشر إلى طابور، وملف يُكتب في تخزين الكائنات، ونداء HTTP يُطلق سير عمل لاحقًا، وبريد إلكتروني يُرسل عبر مزوّد سلّم البايتات بالفعل إلى MTA بعيد. لكل من هذه مفهومه الخاص لما يعنيه التراجع عن الكتابة، والعديد منها لا يملك هذا المفهوم على الإطلاق.
زر التراجع خاصية في واجهة المستخدم تخفي مشكلة حالة. في تطبيق أحادي المستخدم بمخزن بيانات واحد، تكون مشكلة الحالة صغيرة بما يكفي لإخفائها. في وكيل يمتد عبر أنظمة، مشكلة الحالة هي مشكلة التصميم. الزر هو ما يتبقى بعد حلها، وليس الشيء الذي تبنيه لحلها.
الآثار ليست متجانسة
من المفيد فصل الآثار بحسب كلفة عكسها، لا بحسب كيفية ظهورها في التتبع.
بعض الآثار رخيصة العكس. مسودة مستند، كتابة في بيئة اختبار، صف في مخطط مؤقت، علم ميزة يُبدَّل في بيئة اختبار. العكس هو كتابة أخرى من النوع نفسه، ضد السلطة نفسها، والكلفة محدودة.
وبعضها مكلف. بريد إلكتروني مُرسل لا يمكن إلغاء إرساله؛ لا يمكن إلا أن يتبعه تصحيح، وهو بحد ذاته تواصل جديد بجمهوره الخاص وتبعاته الخاصة. يمكن ردّ دفعة مالية، لكن الردّ معاملة جديدة برسوم وتوقيت وآثار تسوية. يمكن أحيانًا استعادة سجل محذوف من نسخة احتياطية، لكن الاستعادة عملية جزئية عند نقطة زمنية قد تدهس تغييرات غير ذات صلة.
وبعضها مستحيل. سرّ أُفصح عنه لا يمكن سحبه. بمجرد أن يغادر بيانات اعتماد أو سجل عميل أو مستند داخلي حدود الثقة، لا تُعيد أي عملية تعويضية العالم إلى حالته السابقة. الضابط ذو الصلة هو المنع، لا العكس.
سؤال التصميم إذن ليس ما إذا كان ينبغي تقديم التراجع. بل أي الأدوات يجوز استدعاؤها دون مسار عكس، وتحت أي شروط مسبقة.
تصنيف آثار الأدوات

التصنيف العملي يتضمن ثلاث فئات، ويجب أن يحمل كل تعريف أداة واحدة منها بالضبط.
قابل للعكس. تكشف الأداة عملية تعويضية بالسلطة نفسها التي للأصل. التعويض متماثل: الهوية نفسها، والنطاق نفسه، وضمانات الاتساق نفسها. إدراج في قاعدة بيانات مع حذف مطابق بالمفتاح الأساسي قابل للعكس. نشر في بيئة اختبار مع تراجع إلى إصدار مثبّت قابل للعكس. الاختبار هو ما إذا كان يمكن إصدار النداء التعويضي بهوية الوكيل نفسها دون موافقة جديدة، وما إذا كانت النتيجة مكافئة للحالة قبل النداء للأغراض التي يهمها التشغيل.
قابل للتعويض. يوجد عكس، لكنه إجراء جديد بآثاره الجانبية وموافقته الخاصة. ردّ الدفع قابل للتعويض: يعكس الأثر الاقتصادي لخصم، لكنه ينشئ قيدًا جديدًا في دفتر الحسابات، وقد يترتب عليه رسم، وقد يتطلب تفويضًا بشريًا فوق حد معين. رسالة منشورة عالجها المستهلكون بالفعل قابلة للتعويض فقط بمعنى أنه يمكن نشر تصحيح؛ أما الاستهلاك الأصلي فلا يمكن التراجع عنه. الأدوات القابلة للتعويض هي حيث تكمن معظم الهندسة المثيرة للاهتمام، لأن التعويض عملية من الدرجة الأولى تحتاج هي نفسها إلى شرط مسبق ومسار موافقة وسجل.
غير قابل للعكس. لا توجد عملية تعويضية. إرسال بريد إلكتروني خارجي، الإفصاح عن سرّ، حذف سجل بلا نسخة احتياطية، استدعاء إجراء طرف ثالث لا يكشف الطرف الثالث عن عكس له. تتطلب هذه تفويضًا مسبقًا، لا تراجعًا لاحقًا. الضابط هو البوابة أمام النداء، لا الإجراء خلفه.
التصنيف لكل أداة، لا لكل وكيل. الوكيل القابل للعكس في معظمه سيظل يحتوي على أداة واحدة غير قابلة للعكس، وهذه الأداة الواحدة تحدد سقف الاستقلالية للتشغيل بأكمله ما لم يكن المخطِّط مقيَّدًا بعزلها.
جعل القابلية للعكس حقلًا من الدرجة الأولى
لا يكون التصنيف مفيدًا إلا إذا كان قابلًا للقراءة آليًا. يجب أن يحمل كل تعريف أداة فئة قابلية للعكس، وحيث توجد، معرّف عملية التعويض الخاصة بها. في مخطط، يبدو ذلك كمجموعة صغيرة من الحقول إلى جانب اسم الأداة ومعاملاتها ونطاق سلطتها.
{
"name": "send_customer_email",
"reversibility": "irreversible",
"compensating_operation": null,
"preconditions": ["recipient_verified", "template_approved", "human_gate_passed"]
}
{
"name": "create_invoice",
"reversibility": "compensable",
"compensating_operation": "void_invoice",
"compensation_requires_approval": true
}
{
"name": "write_staging_record",
"reversibility": "reversible",
"compensating_operation": "delete_staging_record",
"comrver-rack-network-cables-6c483a-2ef0de.jpg)
تتبع آليتان من هذا. أولًا، المخطِّط مقيَّد بالفئة. لا يمكن استدعاء الأدوات غير القابلة للعكس استكشافيًا، ولا وضعها في فروع متوازية حيث يؤدي فشل فرع شقيق إلى ترك أثر جزئي معلّق، ولا إعادة محاولتها عند فشل غامض دون خطوة تسوية صريحة. يمكن استدعاء الأدوات القابلة للتعويض، لكن تعويضها هو نفسه نداء أداة يجب على المخطِّط جدولته، لا تنظيفًا ضمنيًا. يمكن استخدام الأدوات القابلة للعكس بحرية ضمن نطاق سلطتها.
ثانيًا، يخزّن سجل التشغيل عملية التعويض إلى جانب الأثر. عندما تنجح أداة لها عملية تعويضية، يكتب سجل التشغيل معرّف الأثر ومعرّف التعويض معًا، إضافة إلى الوسائط اللازمة لاستدعاء التعويض. يصبح التراجع عندئذ بحثًا لا إعادة بناء. لا يضطر المشغّل المستجيب لحادث إلى استنتاج ما فعله الوكيل والتخمين في العكس؛ يسمّي السجل العملية ووسائطها. هذا هو الفرق بين إجراء استرداد محدود وتحقيق مفتوح النهاية.
## ما الذي يجلبه هذا
المكسب الأول هو استقلالية غير متماثلة. يمكن منح الوكيل استقلالية عالية على الأسطح القابلة للعكس، حيث يكلف الخطأ نداءً تعويضيًا، وبوابات ضيقة على الأسطح غير القابلة للعكس، حيث يكلف الخطأ إفصاحًا أو علاقة عميل. هذا أنفع من مستوى استقلالية عالمي واحد، إما يفرط في تقييد العمل القابل للعكس أو يقلل تقييد العمل غير القابل للعكس. فئة القابلية للعكس هي المحور الذي ينبغي أن تتفاوت الاستقلالية على امتداده.
المكسب الثاني هو الاستجابة للحوادث. عندما يُسجَّل كل أثر مع تعويضه، يصبح إجراء الاسترداد قائمة لا بحثًا. يعرف المشغّل أي الآثار قابلة للعكس، وأيها قابلة للتعويض وتحتاج موافقة، وأيها غير قابلة للعكس وبالتالي تتطلب استجابة مختلفة تمامًا: إشعار واحتواء وإفصاح، لا تراجع.
المكسب الثالث هو التقييم. إذا حملت تعريفات الأدوات قابلية العكس، يمكن لمنظومة التقييم قياس عدد المرات التي يمدّ فيها التشغيل يده إلى أداة غير قابلة للعكس قبل استيفاء شروطها المسبقة. هذا مؤشر سابق على استقلالية مفرطة الحماس، وهو قابل للقياس دون انتظار حادث إنتاجي. كما يتيح التقييم مقارنة صيغ المخطِّط على المهمة نفسها: هل تُكمل الصيغة التي تؤجل النداءات غير القابلة للعكس حتى استيفاء الشروط المسبقة المهمة بالقدر نفسه من المرات، وبأي كلفة من الخطوات؟
## المقايضة الصادقة
يكلف هذا التصميم الإنتاجية. تقييد المخطِّط لعزل الأدوات غير القابلة للعكس، واشتراط جدولة تعويض صريحة للقابلة للتعويض، يزيل التوازي والتنفيذ الاستكشافي الذي يستخدمه مخطِّط أقل تقييدًا. في المهام القابلة للعكس في معظمها، يكون القيد شبه مجاني. في المهام التي تخلط آثارًا قابلة للعكس وأخرى غير قابلة للعكس، سيتسلسل المخطِّط حول النداءات غير القابلة للعكس، وسيكون التشغيل أبطأ وأطول من تشغيل غير مقيَّد. المقايضة متعمدة: البديل هو تشغيل سريع حتى يصبح غير قابل للاسترداد.
الكلفة الثانية هي الصيانة. فئة القابلية للعكس ليست خاصية للأداة في المجرد؛ إنها خاصية للأداة كما هي منشورة، بسلطتها الحالية ووضع نسخها الاحتياطي الحالي ومستهلكيها اللاحقين الحاليين. أداة كانت قابلة للعكس عندما كان مخزنها الخلفي يملك استردادًا عند نقطة زمنية تصبح قابلة للتعويض عندما تُقصَّر نافذة الاسترداد تلك. يجب مراجعة التصنيف إلى جانب الأداة، لا ضبطه مرة واحدة عند التعريف.
## الخاتمة
القابلية للعكس خاصية حالة لكل أداة، لا خاصية مضافة فوق الوكيل. العمل هو تصنيف أثر كل أداة، وتسجيل العملية التعويضية حيث توجد، وتقييد المخطِّط بالفئة، ومنح الاستقلالية بشكل غير متماثل. زر التراجع، إن ظهر أصلًا، هو سطح ذلك العمل. وليس بديلًا عنه.
