أعد محاولة الوظائف غير المتزامنة

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

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

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

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

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

لماذا تفشل الوظائف المستندة إلى الأحداث في الاكتمال

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

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

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

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

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

قم بتكوين عمليات إعادة المحاولة من وحدة تحكم Google Cloud Platform

إذا كنت تقوم بإنشاء وظيفة جديدة:

  1. من شاشة إنشاء وظيفة ، حدد إضافة مشغل واختر نوع الحدث ليكون بمثابة مشغل لوظيفتك.
  2. في جزء مشغل Eventarc ، حدد خانة الاختيار إعادة المحاولة عند الفشل لتمكين إعادة المحاولة.

إذا كنت تقوم بتحديث وظيفة موجودة:

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

قم بتكوين عمليات إعادة المحاولة من رمز وظيفتك

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

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

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

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

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

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

راجع وثائق Pub/Sub حول التعامل مع حالات الفشل للحصول على مزيد من المعلومات حول تكوين Pub/Sub مباشرةً.