وظائف قائمة الانتظار مع المهام السحابية

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

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

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

تعمل حزمة Firebase SDK للوظائف السحابية لـ Firebase الإصدار 3.20.1 والإصدارات الأحدث مع Firebase Admin SDK v10.2.0 والإصدارات الأحدث لدعم وظائف قائمة انتظار المهام.

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

إنشاء مهام قائمة انتظار المهام

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

  1. اكتب وظيفة قائمة انتظار المهام باستخدام Firebase SDK لوظائف السحابة.
  2. اختبر وظائفك باستخدام Firebase Local Emulator Suite.
  3. انشر وظيفتك باستخدام Firebase CLI. عند نشر وظيفة قائمة انتظار المهام لأول مرة ، سينشئ 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 مهام على الأكثر في وقت معين. يساعد هذا في ضمان التدفق المستمر للطلبات إلى الوظيفة الأساسية ويساعد على تقليل عدد المثيلات النشطة والبدء البارد.

اختبار وظائف قائمة انتظار المهام باستخدام Firebase Local Emulator Suite

يتم عرض وظائف قائمة انتظار المهام في Firebase Local Emulator Suite كوظائف HTTP بسيطة. يمكنك اختبار وظيفة مهمة تمت محاكاتها عن طريق إرسال طلب 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 CLI:

$ firebase deploy --only functions:backupApod

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

إذا واجهت أخطاء في الأذونات عند نشر الوظائف ، فتأكد من تعيين أدوار IAM المناسبة للمستخدم الذي يقوم بتشغيل أوامر النشر.

قم بإدراج الدالة في قائمة الانتظار

يمكن إدراج وظائف قائمة انتظار المهام في قائمة المهام السحابية من بيئة خادم موثوق بها مثل وظائف السحابة لـ Firebase باستخدام Firebase Admin SDK لـ Node.js. إذا كنت مستخدمًا جديدًا لـ Admin SDKs ، فراجع إضافة Firebase إلى خادم للبدء.

في تدفق نموذجي ، تُنشئ Admin SDK مهمة جديدة ، وتضعها في قائمة الانتظار في {cloudtasks_name}} ، وتضبط التكوين للمهمة:

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

استكشاف الأخطاء وإصلاحها

قم بتشغيل تسجيل المهام السحابية

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

أذونات IAM

قد ترى أخطاء تم PERMISSION DENIED الإذن عند إدراج المهام في قائمة الانتظار أو عندما تحاول Cloud Tasks استدعاء وظائف قائمة انتظار المهام. تأكد من أن مشروعك يحتوي على ارتباطات IAM التالية:

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