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


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

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

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

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

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

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

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

  1. اكتب وظيفة قائمة انتظار المهام باستخدام Firebase SDK for Cloud Functions.
  2. اختبر وظيفتك عن طريق تشغيلها بطلب HTTP.
  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 كوظائف 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 المناسبة للمستخدم الذي يقوم بتشغيل أوامر النشر.

Enqueue وظائف قائمة انتظار المهام

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

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

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

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

أذونات إدارة الهوية وإمكانية الوصول (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

راجع وثائق 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