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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  1. من صفحة نظرة عامة على دوال Cloud، انقر على اسم التي تقوم بتحديثها لفتح شاشة تفاصيل الدالة، ثم اختر Edit (تعديل) من شريط القوائم لعرض لوحة Trigger (المشغّلات).
  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) تقديم مفتاح تحديد الهوية. كمعلمة. إذا كنت تستخدم واجهة برمجة تطبيقات من هذا النوع، عليك استخدام معرِّف الحدث على النحو التالي: مفتاح الهوية.
  • تعمل الهوية بشكل جيد مع التسليم مرة واحدة على الأقل، لأنها تجعل من الآمن إعادة المحاولة. لذا فإن أفضل ممارسة عامة لكتابة التعليمات البرمجية الموثوقة هي دمج المثلية مع إعادة المحاولة.
  • تأكد من أن التعليمة البرمجية غير تابعة داخليًا. مثل:
    • التأكد من أن الطفرات يمكن أن تحدث أكثر من مرة دون تغيير المرجو.
    • طلب البحث عن حالة قاعدة البيانات في معاملة قبل تغيير الحالة.
    • تأكد من أن جميع الآثار الجانبية نفسها ثابتة.
  • فرض فحص المعاملات خارج الوظيفة، مستقلاً عن الرمز على سبيل المثال، استمر في الإشارة إلى مكان تسجيل يحتوي على معرّف حدث معين تمت معالجتها بالفعل.
  • التعامل مع استدعاءات الدوال المكررة خارج النطاق. على سبيل المثال، يمكنك حذف بيانات منفصلة يتم تنظيفها بعد استدعاء الدوال المكررة.

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

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

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

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

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

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