תור פונקציות עם Cloud Tasks


פונקציות תור המשימות מנצלות את היתרונות של Google Cloud Tasks כדי לעזור לאפליקציה שלך להריץ משימות גוזלות זמן, עתירות משאבים או מוגבלות ברוחב פס באופן אסינכרוני, מחוץ לזרימת האפליקציה הראשית שלך.

לדוגמה, דמיינו שאתם רוצים ליצור גיבויים של קבוצה גדולה של קבצי תמונה שמתארחים כעת ב-API עם הגבלת קצב. כדי להיות צרכן אחראי של ה-API הזה, עליך לכבד את מגבלות התעריפים שלו. בנוסף, סוג זה של עבודה ארוכת טווח עלול להיות חשוף לכישלון עקב פסק זמן ומגבלות זיכרון.

כדי להפחית את המורכבות הזו, אתה יכול לכתוב פונקציית תור משימות שמגדירה אפשרויות משימה בסיסיות כמו scheduleTime ו- dispatchDeadline , ולאחר מכן להעביר את הפונקציה לתור ב-Cloud Tasks. סביבת Cloud Tasks תוכננה במיוחד כדי להבטיח בקרת גודש יעילה ומדיניות ניסיון חוזר עבור פעולות מסוג זה.

Firebase SDK for Cloud Functions for Firebase v3.20.1 ואילך פועל בשילוב עם Firebase Admin SDK v10.2.0 ואילך כדי לתמוך בפונקציות של תור משימות.

שימוש בפונקציות בתור משימות עם Firebase עלול לגרום לחיובים עבור עיבוד משימות ענן. ראה תמחור Cloud Tasks למידע נוסף.

צור פונקציות בתור משימות

כדי להשתמש בפונקציות של תור משימות, בצע את זרימת העבודה הבאה:

  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 שניות לפחות מכל ניסיון. זה מספק חיץ גדול בין כל ניסיון כך שלא נמהר למצות את 5 ניסיונות הניסיון החוזר מהר מדי.
  • 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 המתאימים מוקצים למשתמש המריץ את פקודות הפריסה.

תור פונקציות של תור משימות

ניתן להעמיד פונקציות בתור משימות בתור ב-Cloud Tasks מסביבת שרת מהימנה כמו Cloud Functions for Firebase באמצעות Firebase Admin SDK עבור Node.js. אם אתה חדש ב-Admin SDKs, ראה הוסף 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 ימתינו להשלמת משימה. 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