Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

תור פונקציות עם 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. בדוק את הפונקציות שלך באמצעות Firebase Local Emulator Suite.
  3. פרוס את הפונקציה שלך עם Firebase CLI. בעת פריסת פונקציית תור המשימות שלך בפעם הראשונה, ה-CLI יצור תור משימות ב-Cloud Tasks עם אפשרויות (הגבלת קצב וניסיון חוזר) המצוינות בקוד המקור שלך.
  4. הוסף משימות לתור המשימות החדש שנוצר, העברת פרמטרים כדי להגדיר לוח זמנים לביצוע במידת הצורך. אתה יכול להשיג זאת על ידי כתיבת הקוד באמצעות ה-Admin SDK ופריסה שלו ב-Cloud Functions for Firebase.

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

השתמש onTaskDispatched כדי להתחיל בכתיבת פונקציות בתור משימות. חלק חשוב בכתיבת פונקציית תור משימות הוא להגדיר ניסיון חוזר לכל תור ותצורה מגבילת קצב. דוגמאות קוד בדף זה מבוססות על אפליקציה שמגדירה שירות שמגבה את כל התמונות מתמונת היום באסטרונומיה של נאס"א:

תצורת תור המשימות

פונקציות תור המשימות מגיעות עם קבוצה רבת עוצמה של הגדרות תצורה כדי לשלוט במדויק על מגבלות קצב והתנהגות חוזרת של תור משימות:

exports.backupapod = onTaskDispatched(
    {
      retryConfig: {
        maxAttempts: 5,
        minBackoffSeconds: 60,
      },
      rateLimits: {
        maxConcurrentDispatches: 6,
      },
    }, async (req) => {
  • retryConfig.maxAttempts=5 : כל משימה בתור המשימות מתבצעת מחדש אוטומטית עד 5 פעמים. זה עוזר להפחית שגיאות חולפות כמו שגיאות רשת או הפרעה זמנית בשירות של שירות חיצוני תלוי.
  • retryConfig.minBackoffSeconds=60 : כל משימה מתבצעת מחדש בהפרש של 60 שניות לפחות מכל ניסיון. זה מספק חיץ גדול בין כל ניסיון כך שלא נמהר למצות את 5 ניסיונות הניסיון החוזר מהר מדי.
  • rateLimits.maxConcurrentDispatch=6 : לכל היותר 6 משימות נשלחות בזמן נתון. זה עוזר להבטיח זרם קבוע של בקשות לפונקציה הבסיסית ועוזר להפחית את מספר המופעים הפעילים והתחלות קרות.

בדיקת פונקציות בתור משימות באמצעות Firebase Local Emulator Suite

פונקציות תור המשימות ב-Firebase Local Emulator Suite נחשפות כפונקציות HTTP פשוטות. אתה יכול לבדוק פונקציית משימה מדומה על ידי שליחת בקשת HTTP POST עם מטען נתונים של json:

 # start the Local Emulator Suite
 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 SDK, ראה הוסף Firebase לשרת כדי להתחיל.

בזרימה טיפוסית, ה-Admin SDK יוצר משימה חדשה, מעמיד אותה בתור ב-Cloud Tasks ומגדיר את התצורה עבור המשימה:

exports.enqueuebackuptasks = onRequest(
    async (_request, response) => {
      const queue = getFunctions().taskQueue("backupapod");
      const targetUri = await getFunctionUrl("backupapod");

      const enqueues = [];
      for (let i = 0; i <= BACKUP_COUNT; i += 1) {
        const iteration = Math.floor(i / HOURLY_BATCH_SIZE);
        // Delay each batch by N * hour
        const scheduleDelaySeconds = iteration * (60 * 60);

        const backupDate = new Date(BACKUP_START_DATE);
        backupDate.setDate(BACKUP_START_DATE.getDate() + i);
        // Extract just the date portion (YYYY-MM-DD) as string.
        const date = backupDate.toISOString().substring(0, 10);
        enqueues.push(
            queue.enqueue({date}, {
              scheduleDelaySeconds,
              dispatchDeadlineSeconds: 60 * 5, // 5 minutes
              uri: targetUri,
            }),
        );
      }
      await Promise.all(enqueues);
      response.sendStatus(200);
    });
  • scheduleDelaySeconds : הקוד לדוגמה מנסה לפזר את הביצוע של משימות על ידי שיוך עיכוב של דקות Nth עבור המשימה Nth. זה מתורגם להפעלת ~ משימה אחת/דקה. שים לב שאתה יכול גם להשתמש ב- scheduleTime אם אתה רוצה שמשימות ענן יפעילו משימה בזמן מסוים.
  • dispatchDeadlineSeconds : פרק הזמן המקסימלי ש-Cloud Tasks ימתינו להשלמת משימה. Cloud Tasks ינסה שוב את המשימה לאחר הגדרת הנסיון החוזר של התור או עד למיצוי המועד האחרון. בדוגמה, התור מוגדר לנסות שוב את המשימה עד 5 פעמים, אך המשימה מבוטלת באופן אוטומטי אם כל התהליך (כולל ניסיונות ניסיון חוזר) נמשך יותר מ-5 דקות.

אחזר וכלול את URI היעד

מכיוון ש-Cloud Functions for Firebase (דור שני) לא תומכת בכתובות URL דטרמיניסטיות של HTTP, עליך לאחזר ולכלול באופן ידני את URI היעד בכל משימה שממוקמת בתור. אתה יכול גם לאחזר באופן פרוגרמטי את כתובת האתר עבור הפונקציה שלך כפי שמוצג להלן:

/**
 * Get the URL of a given v2 cloud function.
 *
 * @param {string} name the function's name
 * @param {string} location the function's location
 * @return {Promise<string>} The URL of the function
 */
async function getFunctionUrl(name, location="us-central1") {
  if (!auth) {
    auth = new GoogleAuth({
      scopes: "https://www.googleapis.com/auth/cloud-platform",
    });
  }
  const projectId = await auth.getProjectId();
  const url = "https://cloudfunctions.googleapis.com/v2beta/" +
    `projects/${projectId}/locations/${location}/functions/${name}`;

  const client = await auth.getClient();
  const res = await client.request({url});
  const uri = res.data?.serviceConfig?.uri;
  if (!uri) {
    throw new Error(`Unable to retreive uri for function at ${url}`);
  }
  return uri;
}

פתרון תקלות

הפעל את רישום המשימות בענן

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

הרשאות 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