إعادة تجربة الدوال غير المتزامنة

يوضّح هذا المستند كيفية طلب دوال الخلفية غير المتزامنة (التي لا تستخدم HTTPS) لإعادة المحاولة عند التعذُّر.

دلالات إعادة المحاولة

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

بالنسبة لدوال الجيل الثاني، تنتهي صلاحية نافذة إعادة المحاولة هذه بعد 24 ساعة. بالنسبة إلى دوال الجيل الأول، تنتهي صلاحيتها بعد 7 أيام. تعيد دوال Cloud Functions تنفيذ الدوال التي تم إنشاؤها حديثًا والتي تعتمد على الأحداث باستخدام استراتيجية تراجع أسي، مع فترة تراجع متزايدة تتراوح بين 10 و600 ثانية. يتم تطبيق هذه السياسة على الدوال الجديدة في المرة الأولى التي تنشرها فيها. ولا يتم تطبيقه بأثر رجعي على الدوال الحالية التي تم نشرها لأول مرة قبل سريان التغييرات الموضّحة في ملاحظة الإصدار هذه، حتى في حال إعادة نشر الدوال.

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

سبب تعذُّر إكمال الدوال المستندة إلى الأحداث

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

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

  • تحتوي الدالة على خطأ وتُنشئ بيئة التشغيل استثناءً.
  • ولا يمكن للدالة الوصول إلى نقطة نهاية الخدمة، أو انتهاء المهلة أثناء محاولة تنفيذ ذلك.
  • تعمد الدالة إلى طرح استثناء عمدًا (على سبيل المثال، عندما يخفق التحقق من المعلمة).
  • تعرض دالة Node.js وعود مرفوضة أو تمرِّر قيمة غير تابعة لـ null إلى استدعاء.

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

تفعيل إعادة المحاولة أو إيقافها

إعداد عمليات إعادة المحاولة من وحدة التحكّم

إذا كنت تنشئ دالة جديدة:

  1. من شاشة إنشاء دالة، ضمن عامل التفعيل، اختَر نوع الحدث ليكون بمثابة عامل تشغيل للوظيفة.
  2. ضَع علامة في مربّع الاختيار إعادة المحاولة عند التعذُّر لتفعيل عمليات إعادة المحاولة.

في حال تحديث دالة حالية:

  1. من صفحة نظرة عامة على دوال Cloud، انقر على اسم الوظيفة التي تعدّلها لفتح شاشة تفاصيل الدالة، ثم اختَر تعديل من شريط القوائم لعرض لوحة المشغّل.
  2. ضَع علامة في مربّع الاختيار إعادة المحاولة عند التعذُّر أو أزِلها لتفعيل عمليات إعادة المحاولة أو إيقافها.

إعداد عمليات إعادة المحاولة من رمز الدالة

مع وظائف السحابة الإلكترونية لبرنامج Firebase، يمكنك تفعيل عمليات إعادة المحاولة في الرمز لإحدى الوظائف. لإجراء ذلك في وظيفة تعمل في الخلفية مثل functions.foo.onBar(myHandler);، استخدِم runWith وضبط سياسة إخفاق:

functions.runWith({failurePolicy: true}).foo.onBar(myHandler);

يؤدي ضبط true على النحو الموضّح إلى إعداد دالة لإعادة المحاولة عند التعذُّر.

أفضل الممارسات

يصف هذا القسم أفضل الممارسات لاستخدام محاولات إعادة المحاولة.

استخدام إعادة المحاولة لمعالجة الأخطاء المؤقتة

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

يمكنك ضبط شرط انتهاء لتجنُّب تكرارات إعادة المحاولة اللانهائية.

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

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

على سبيل المثال، يتجاهل مقتطف الرمز هذا جميع الأحداث التي مر عليها أكثر من 10 ثوانٍ:

const eventAgeMs = Date.now() - Date.parse(event.timestamp);
const eventMaxAgeMs = 10000;
if (eventAgeMs > eventMaxAgeMs) {
  console.log(`Dropping event ${event} with age[ms]: ${eventAgeMs}`);
  callback();
  return;
}

استخدام "catch" مع التعهدات

إذا تم تفعيل إعادة المحاولة في الدالة، سيؤدي أي خطأ لم تتم معالجته إلى إعادة المحاولة. تأكّد من تسجيل الرمز لأي أخطاء من المفترض ألا تؤدي إلى إعادة المحاولة.

إليك مثال على ما يجب عليك فعله:

return doFooAsync().catch((err) => {
    if (isFatal(err)) {
        console.error(`Fatal error ${err}`);
    }
    return Promise.reject(err);
});

جعل الدوال القابلة لإعادة المحاولة المستندة إلى الأحداث متسقة

يجب أن تكون الدوال المستندة إلى الأحداث التي يمكن إعادة محاولة تنفيذها ثابتة. فيما يلي بعض الإرشادات العامة لجعل هذه الدالة ثابتة:

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

ضبط سياسة إعادة المحاولة

بناءً على احتياجات دالة Cloud، قد تحتاج إلى ضبط سياسة إعادة المحاولة مباشرةً. وسيتيح لك ذلك إعداد أي مجموعة مما يلي:

  • يجب تقليل فترة إعادة المحاولة من 7 أيام إلى 10 دقائق فقط.
  • قم بتغيير الحد الأدنى والأقصى لوقت التراجع لاستراتيجية إعادة محاولة التراجع الأسي.
  • غيِّر استراتيجية إعادة المحاولة لإعادة المحاولة على الفور.
  • اضبط موضوعًا لا يبطل رواجه.
  • اضبط حدًّا أقصى وأدنى لعدد محاولات التسليم.

لإعداد سياسة إعادة المحاولة:

  1. اكتب دالة HTTP.
  2. استخدِم واجهة برمجة تطبيقات Pub/Sub لإنشاء اشتراك في خدمة Pub/Sub، مع تحديد عنوان URL للدالة على أنّه الهدف.

يمكنك الاطّلاع على مستندات النشر/الاشتراك حول معالجة الأخطاء للحصول على مزيد من المعلومات حول إعداد خدمة Pub/Sub مباشرةً.