jsonscraper
الأسواق
العودة إلى المجلة

أضافت Cloudflare إعادة محاولات استدعاءات Durable Objects وفصلت بينها بحسب كلفة الخطأ

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

السياسة التحريرية الإبلاغ عن خطأ

إذا انتهى استدعاء Durable Object بفشل في الشبكة، كان على المطوّر غالبًا أن يقرر ما إذا كان سيعيد إرساله. ومنذ 5 نوفمبر 2026، يتولى وقت تشغيل Cloudflare تنفيذ بعض عمليات الإعادة هذه: إذ يعيد تلقائيًا محاولات محددة فاشلة لـ fetch() وطلبات RPC عبر stub. أما السؤال الأهم للشيفرة التطبيقية فأصبح أدق: هل يمكن تنفيذ طريقة بعينها بأمان مرة ثانية؟

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

ما الذي يعيده وقت التشغيل تحديدًا؟

وفقًا لإعلان Cloudflare الصادر في 5 نوفمبر، تشمل عمليات الإعادة استدعاءات fetch() وطلبات RPC إلى Durable Object التي يجريها Worker أو Durable Object آخر. وبالنسبة إلى الاستدعاءات عبر stub، تُتاح افتراضيًا المحاولة الأولى وما يصل إلى أربع محاولات إضافية؛ ولا تبدأ محاولات جديدة بعد مرور 10 ثوانٍ على بدء الاستدعاء.

مقال: أضافت Cloudflare إعادة محاولات استدعاءات Durable Objects وفصلت بينها بحسب كلفة الخطأ
الملخص: منذ 5 نوفمبر، تعيد Cloudflare تلقائيًا بعض الاستدعاءات الفاشلة لـ Durable Objects. والأهم للمطوّر هو التمييز بين إعادة إرسال الطلب وإعادة تنفيذ الطريقة؛ فهذا يحدد مدى أمان وضع علامة retryable على العملية، وما إذا كان المنطق الجديد يتعارض مع آليات إعادة المحاولة الموجودة في التطبيق.
دور الصورة: غلاف — الفكرة المحورية
القسم: ما الذي يعيده وقت التشغيل تحديدًا؟
الموضوع المرئي: صورة تحريرية ill
قد يُمنع إرسال الطلب مجددًا إذا كان الكائن قد تلقى الاستدعاء الأصلي؛ أما إعادة تنفيذ الطريقة فتُتاح بصورة منفصلة للطريقة الموسومة.© jsonscraper · أُنشئت بالذكاء الاصطناعي

يشترط لذلك وقوع خطأ يحمل الخاصية .retryable. فعلى سبيل المثال، قد لا يصل الطلب إلى الكائن بسبب إعادة تشغيله أو نقله. وقد يعيد وقت التشغيل المحاولة أيضًا إذا انقطع الاتصال وتعذّر تحديد ما إذا كان الكائن قد تلقى الطلب. وإذا كان الكائن قد تلقى الطلب بالفعل، تُرفض المحاولة المكررة التي تحمل المعرّف نفسه. ولا يعيد وقت التشغيل المحاولة عند وقوع أخطاء تطرحها شيفرة Durable Object، أو أخطاء تحمل الخاصية .overloaded، أو استجابات HTTP مثل 500؛ فهذه استجابة من معالج الطلب، وليست خطأً في التسليم.

لماذا لا تعني إعادة إرسال الطلب إعادة تنفيذ العملية؟

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

مقال: أضافت Cloudflare إعادة محاولات استدعاءات Durable Objects وفصلت بينها بحسب كلفة الخطأ
الملخص: منذ 5 نوفمبر، تعيد Cloudflare تلقائيًا بعض الاستدعاءات الفاشلة لـ Durable Objects. والأهم للمطوّر هو التمييز بين إعادة إرسال الطلب وإعادة تنفيذ الطريقة؛ فهذا يحدد مدى أمان وضع علامة retryable على العملية، وما إذا كان المنطق الجديد يتعارض مع آليات إعادة المحاولة الموجودة في التطبيق.
دور الصورة: رسم توضيحي داعم 2 — جانب محدد مختلف
القسم: لماذا لا تعني إعادة إرسال الطلب إعادة تنفيذ العملية؟
الموضوع المرئي: رسم تخطيطي يوضح الفرق ill
يوضح المخطط الفرق بين إعادة إرسال الطلب وإعادة تشغيل الطريقة.© jsonscraper · رسم توضيحي مُنشأ بالذكاء الاصطناعي

يتغير الحد الفاصل عندما توضع على الطريقة علامة retryable() المستوردة من cloudflare:durable-objects. عندها يُسمح للكائن بإعادة تنفيذ الطريقة إذا كان من المحتمل أن تكون المحاولة الأولى قد بدأت بالفعل. وتورد Cloudflare مثالين: تعيين كمية المنتج إلى قيمة محددة عملية تكرارية آمنة؛ أما زيادة الكمية بمقدار واحد فليست كذلك. فإعادة تنفيذ العملية الأولى تعيّن القيمة نفسها، بينما تضيف إعادة تنفيذ الثانية وحدة أخرى.

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

متى تكون علامة idempotency الصريحة مفيدة؟

غالبًا ما يؤدي تعيين قيمة، أو حفظ لقطة للحالة، أو تحديث حقل إلى قيمة معروفة، إلى النتيجة نفسها عند التكرار. وقد تتيح retryable() لهذه الطرق إكمال الاستدعاء بنجاح بعد انقطاع الاتصال الذي يقع عقب بدء المعالجة.

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

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

ما الذي ينبغي التحقق منه في مشروع قائم؟

أكثر المواضع ترجيحًا للمراجعة هي حلقات إعادة المحاولة التي أُنشئت يدويًا حول استدعاءات Durable Objects. فقد تشمل كل محاولة الآن عمليات إعادة ينفذها وقت التشغيل، ولذلك قد يتجاوز العدد الإجمالي للاستدعاءات ما تحدده طبقة التطبيق وحدها. وتوصي Cloudflare بتقليل عدد المحاولات التي يديرها التطبيق، أو بتعيين maxRetries: 0 لـ stub إذا كان كودك هو الذي يدير عمليات الإعادة.

يمكن ضبط الحدود الخاصة بـ stub بعينه عند استدعاء get() أو getByName(). تحدد الخاصية maxRetries عدد المحاولات الإضافية، من صفر إلى عشر، بعد المحاولة الأولى؛ أما timeoutMs فتحدد المدة التي بعدها لن تبدأ محاولات جديدة، من 500 إلى 60,000 ملي ثانية. وتنطبق هذه الإعدادات على الاستدعاءات التي تمر عبر ذلك الـ stub. وتتطلب إمكانيتا retryable() والكائن retry الإصدار 4.158.0 أو أحدث من Wrangler.

تتضمن المراجعة المفيدة طرح ثلاثة أسئلة لكل استدعاء: هل يمكن أن يغيّر الحالة أكثر من مرة؟ وهل سيكرر آثارًا جانبية خارجية؟ وهل لدى التطبيق سياسة خاصة لإعادة المحاولة؟ بعد ذلك، قرر ما إذا كان ينبغي لهذا الـ stub استخدام القيم الافتراضية أم حدود مخصصة. وبالنسبة إلى الطرق التكرارية الآمنة، قيّم على حدة ما إذا كانت تستحق وضع العلامة صراحةً؛ أما الطرق الأخرى، فأبقِ الحماية قائمة وتحقق من معالجة الخطأ حين تكون نتيجة المحاولة الأولى غير معروفة.

النتيجة: تنتقل المسؤولية إلى حدود الطريقة

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

لذلك ينبغي قراءة هذا التحديث بوصفه تغييرًا في العقد بين طبقة النقل ومعالج الطلب. تحقّق أولًا من حلقات إعادة المحاولة الخاصة بالتطبيق ومن قابلية تكرار الآثار الجانبية؛ ثم اضبط الحدود على وحدات stub المعنية. وهكذا يمكن الجمع بين المرونة المدمجة أمام الأعطال القصيرة والتحكم في العمليات التي تترتب على تشغيلها مرة ثانية كلفة حقيقية.

الناس

لم يتم إدراج أي أشخاص لهذه المقالة حتى الآن.

استمر في القراءةأصبحت Cloudflare تؤجل تحديث Durable Objects لإتاحة إكمال المهام النشطة
إقرأ المقال التالي

حوّل ما تقرأه إلى تكامل عملي

استكشف واجهات API للبيانات الاجتماعية من jsonscraper واختبر الطلبات وأنشئ سير عملك التالي.

استكشف واجهات API