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


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

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

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

إصدار 3.20.1 أو إصدار أحدث من حزمة تطوير البرامج (SDK) لمنصة Firebase لوظائف السحابة الإلكترونية لبرنامج Firebase وإصدارات أعلى من حيث التشغيل التفاعلي مع الإصدار 10.2.0 من حزمة تطوير البرامج (SDK) لمشرف Firebase أو الإصدارات الأحدث لدعم وظائف قائمة انتظار المهام.

يمكن أن يؤدي استخدام وظائف قائمة انتظار المهام مع Firebase إلى تحصيل رسوم مقابل معالجة "مهام Google" في السحابة الإلكترونية. يُرجى الاطّلاع على أسعار "مهام السحابة الإلكترونية" للحصول على مزيد من المعلومات.

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

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

  1. كتابة دالة في قائمة انتظار المهام باستخدام حزمة تطوير البرامج (SDK) لمنصة Firebase لدوال السحابة الإلكترونية.
  2. اختبر الدالة عن طريق تشغيلها باستخدام طلب HTTP.
  3. انشر الدالة باستخدام واجهة سطر الأوامر في Firebase. عند نشر دالة قائمة انتظار المهام للمرة الأولى، سينشئ واجهة سطر الأوامر (CLI) قائمة انتظار للمهام في مهام السحابة الإلكترونية مع تحديد خيارات (تحديد المعدّل وإعادة المحاولة) في الرمز المصدر.
  4. أضف المهام إلى قائمة انتظار المهام التي تم إنشاؤها حديثًا، مع تمرير المعلمات لإعداد جدول تنفيذ إذا لزم الأمر. يمكنك تحقيق ذلك من خلال كتابة الرمز البرمجي باستخدام 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" كدوال 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:

$ firebase deploy --only functions:backupApod

عند نشر دالة في قائمة انتظار المهام للمرة الأولى، تنشئ واجهة سطر الأوامر (CLI) قائمة انتظار للمهام في "مهام السحابة الإلكترونية" مع تحديد خيارات (تحديد المعدّل وإعادة المحاولة) في رمز المصدر.

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

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

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

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

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

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

تفعيل تسجيل "مهام السحابة الإلكترونية"

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

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

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

  • تحتاج الهوية المستخدمة لإدراج المهام إلى "مهام Google" في قائمة المحتوى التالي إلى إذن "إدارة الهوية وإمكانية الوصول" cloudtasks.tasks.create.

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

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

    وفي النموذج، يكون ذلك هو حساب الخدمة التلقائي لـ 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