إدراج الدوال في قائمة انتظار مع "مهام Cloud"


تستفيد دوال قائمة المهام من ميزات Google Cloud Tasks لمساعدة تطبيقك في تشغيل تطبيقك، ما يستهلك وقتًا طويلاً أو يستهلك موارد كثيرة أو يعتمد على معدّل نقل بيانات محدود المهام بشكل غير متزامن، خارج مسار التطبيق الرئيسي.

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

للتخفيف من هذا التعقيد، يمكنك كتابة دالة قائمة انتظار المهام التي تحدد خيارات المهام مثل scheduleTime وdispatchDeadline، ثم تسليم إيقاف الوظيفة إلى قائمة انتظار في Cloud Tasks. Cloud Tasks صُممت خصيصًا لضمان التحكم الفعال في الازدحام إعادة محاولة تطبيق السياسات لهذه الأنواع من العمليات.

حزمة تطوير البرامج (SDK) لمنصّة Firebase للإصدار 3.20.1 والإصدارات الأحدث من Cloud Functions for Firebase مع الإصدار 10.2.0 من Firebase Admin SDK والإصدارات الأحدث لدعم وظائف قائمة انتظار المهام.

يمكن أن يؤدي استخدام وظائف قائمة انتظار المهام مع Firebase إلى تحصيل رسوم جارٍ معالجة "Cloud Tasks". عرض سعر Cloud Tasks لمزيد من المعلومات.

إنشاء دوال قائمة المهام

لاستخدام وظائف قائمة انتظار المهام، اتبع سير العمل التالي:

  1. اكتب دالة قائمة انتظار المهام باستخدام حزمة تطوير البرامج (SDK) Firebase للنطاق Cloud Functions.
  2. اختبِر الدالة من خلال تشغيلها باستخدام طلب HTTP.
  3. يمكنك نشر الدالة باستخدام واجهة سطر الأوامر Firebase. عند نشر مهمتك لأول مرة، سيقوم CLI بإنشاء قائمة انتظار المهام في Cloud Tasks مع تحديد الخيارات (تحديد المعدل وإعادة المحاولة) في رمز المصدر.
  4. إضافة مهام إلى قائمة انتظار المهام التي تم إنشاؤها حديثًا، وتمرير المعلمات لإعداد جدول التنفيذ إذا لزم الأمر. يمكنك تحقيق ذلك عن طريق كتابة التعليمات البرمجية باستخدام Admin SDK ونشرها في Cloud Functions for Firebase.

كتابة دوال قائمة المهام

استخدام onDispatch للبدء في كتابة دوال قائمة المهام. من المهم جزءًا من كتابة دالة قائمة انتظار المهام هو تعيين إعادة المحاولة لكل قائمة انتظار ومعدّل تقييد التهيئة. تستند عيّنات التعليمات البرمجية في هذه الصفحة إلى تطبيق يحدِّد خدمة تحتفظ بنسخة احتياطية من جميع الصور من وكالة ناسا صورة اليوم الفلكية:

ضبط وظائف قائمة انتظار المهام

تأتي وظائف قائمة انتظار المهام مع مجموعة فعالة من إعدادات التهيئة للتحكم بدقة في حدود المعدل وإعادة محاولة سلوك قائمة انتظار المهام:

exports.backupApod = functions
    .runWith( {secrets: ["NASA_API_KEY"]})
    .tasks.taskQueue({
      retryConfig: {
        maxAttempts: 5,
        minBackoffSeconds: 60,
      },
      rateLimits: {
        maxConcurrentDispatches: 6,
      },
    }).onDispatch(async (data) => {
  • retryConfig.maxAttempts=5: كل مهمة في قائمة انتظار المهام يتم تنفيذها تلقائيًا وتكرار المحاولة حتى 5 مرات. يساعد ذلك في الحدّ من الأخطاء المؤقتة مثل الأخطاء المرتبطة بالشبكة حدوث أخطاء أو انقطاع مؤقت في خدمة خارجية تابعة.
  • retryConfig.minBackoffSeconds=60: تتم إعادة محاولة كل مهمة لمدة 60 ثانية على الأقل عن كل محاولة. يوفر هذا موردًا احتياطيًا كبيرًا بين كل محاولة حتى لا ننتهك من المحاولات الخمس لإعادة المحاولة بسرعة كبيرة.
  • rateLimits.maxConcurrentDispatch=6: يتم إرسال 6 مهام على الأكثر في في أي وقت. ويساعد هذا في ضمان تدفق ثابت للطلبات إلى المصدر وتساعد في تقليل عدد الحالات النشطة وعمليات التشغيل على البارد.

اختبار دوال قائمة المهام

في معظم الحالات، يُعدّ محاكي "Cloud Functions" أفضل طريقة لاختبار المهمة. دوال قائمة الانتظار. اطّلِع على مستندات Emulator Suite للتعرّف على كيفية استخدام تطبيقك لمحاكاة دوال قائمة المهام.

بالإضافة إلى ذلك، يتم عرض دوال قائمة انتظار المهام بسيطة دوال HTTP في Firebase Local Emulator Suite. يمكنك اختبار دالة تمت محاكاتها عن طريق إرسال طلب HTTP POST طلب يحتوي على حمولة بيانات بتنسيق json:

 # start the Firebase Emulators
 firebase emulators:start

 # trigger the emulated task queue function
 curl \
  -X POST                                            # An HTTP POST request...
  -H "content-type: application/json" \              # ... with a JSON body
  http://localhost:$PORT/$PROJECT_ID/$REGION/$NAME \ # ... to function url
  -d '{"data": { ... some data .... }}'              # ... with JSON encoded data

نشر دوال قائمة المهام

نشر دالة قائمة انتظار المهام باستخدام واجهة سطر الأوامر لـ Firebase:

$ firebase deploy --only functions:backupApod

عند نشر دالة قائمة انتظار مهام لأول مرة، ينشئ واجهة سطر الأوامر قائمة انتظار المهام في Cloud Tasks مع خيارات (تحديد المعدل وإعادة المحاولة) المحددة في رمز المصدر.

إذا واجهتك أخطاء في الأذونات عند نشر الدوال، تأكَّد من أدوار "إدارة الهوية وإمكانية الوصول" المناسبة يتم تعيينها للمستخدم الذي يشغل أوامر النشر.

إدراج دوال قائمة انتظار المهام

يمكن إضافة دوال قائمة المهام في قائمة الانتظار في Cloud Tasks من موقع بيئة خادم مثل Cloud Functions for Firebase تستخدم Firebase Admin SDK Node.js. إذا كانت هذه أول مرة تستخدم فيها "Admin SDK"، يمكنك الاطّلاع على يمكنك إضافة Firebase إلى خادم للبدء.

في مسار نموذجي، تنشئ Admin SDK مهمة جديدة وتدرِجها في قائمة انتظار. Cloud Tasks، وضبط الإعدادات للمهمة:

exports.enqueueBackupTasks = functions.https.onRequest(
async (_request, response) => {
  const queue = getFunctions().taskQueue("backupApod");
  const enqueues = [];
  for (let i = 0; i <= 10; i += 1) {
    // Enqueue each task with i*60 seconds delay. Our task queue function
    // should process ~1 task/min.
    const scheduleDelaySeconds = i * 60 
    enqueues.push(
        queue.enqueue(
          { id: `task-${i}` },
          {
            scheduleDelaySeconds,
            dispatchDeadlineSeconds: 60 * 5 // 5 minutes
          },
        ),
    );
  }
  await Promise.all(enqueues);
  response.sendStatus(200);

});
  • scheduleDelaySeconds: يحاول الرمز النموذجي نشر تنفيذ المهام من خلال الارتباط بتأخير الدقائق العددية للمهمة ترتيب. هذا النمط ويترجم إلى تشغيل حوالي مهمة واحدة في الدقيقة. لاحظ أنه يمكنك أيضًا استخدام scheduleTime إذا أردت أن يشغّل Cloud Tasks لمهمة ما في وقت محدد.
  • dispatchDeadlineSeconds: أقصى مدة زمنية سيكون بإمكان "Cloud Tasks" الانتظار لإنجاز مهمة ما. ستتم إعادة المحاولة من قِبل "Cloud Tasks" الْمَهَمَّة بَعْدَ إِعَادَةِ الْمُحَاوَلَة تهيئة قائمة الانتظار أو حتى الوصول إلى هذا الموعد النهائي. في العينة، تهيئة قائمة الانتظار لإعادة محاولة تنفيذ المهمة حتى 5 مرات، ولكن المهمة يتم إلغاؤها تلقائيًا إذا كانت العملية برمتها (بما في ذلك محاولات إعادة المحاولة) يستغرق أكثر من 5 دقائق

تحديد المشاكل وحلّها

Cloud Tasks">تفعيل تسجيل Cloud Tasks

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

أذونات "إدارة الهوية وإمكانية الوصول"

قد تظهر لك PERMISSION DENIED أخطاء عند إضافة المهام أو في حال يحاول تطبيق Cloud Tasks استدعاء وظائف قائمة انتظار المهام. تأكَّد من أنّ سمات يلتزم مشروعك بالتزامات إدارة الهوية وإمكانية الوصول التالية:

  • الهوية المستخدمة لإدراج المهام في قائمة انتظار احتياجات Cloud Tasks cloudtasks.tasks.create إذن "إدارة الهوية وإمكانية الوصول" (IAM).

    في النموذج، هذا هو حساب الخدمة التلقائي لـ App Engine.

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member=serviceAccount:${PROJECT_ID}@appspot.gserviceaccount.com \
  --role=roles/cloudtasks.enqueuer
  • الهوية المستخدمة لإضافة المهام إلى قائمة انتظار Cloud Tasks بحاجة إلى إذن استخدام حساب الخدمة المرتبط بمهمة في "Cloud Tasks"

    في النموذج، هذا هو حساب الخدمة التلقائي لـ App Engine.

الاطّلاع على مستندات Google Cloud IAM للحصول على تعليمات حول كيفية إضافة حساب الخدمة التلقائي على App Engine بصفتك مستخدمًا لحساب خدمة App Engine التلقائي.

gcloud functions add-iam-policy-binding $FUNCTION_NAME \
  --region=us-central1 \
  --member=serviceAccount:${PROJECT_ID}@appspot.gserviceaccount.com \
  --role=roles/cloudfunctions.invoker