הוספת פונקציות לתור באמצעות Cloud Tasks (דור ראשון)

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

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

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

‫Firebase SDK ל-Cloud Functions for Firebase מגרסה 3.20.1 ואילך פועל בשילוב עם Firebase Admin SDK מגרסה 10.2.0 ואילך כדי לתמוך בפונקציות של תור משימות.

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

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

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

  1. כתיבת פונקציה של תור משימות באמצעות Firebase SDK ל-Cloud Functions.
  2. בודקים את הפונקציה על ידי הפעלת הטריגר שלה באמצעות בקשת HTTP.
  3. פורסים את הפונקציה באמצעות Firebase CLI. כשפורסים את הפונקציה של תור המשימות בפעם הראשונה, ה-CLI יוצר תור משימות ב-Cloud Tasks עם האפשרויות (הגבלת קצב וניסיון חוזר) שצוינו בקוד המקור.
  4. מוסיפים משימות לתור המשימות החדש, ומעבירים פרמטרים כדי להגדיר לוח זמנים להפעלה אם צריך. כדי לעשות את זה, כותבים את הקוד באמצעות Admin SDK ומפרסים אותו ב-Cloud Functions for Firebase.

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

כדי להתחיל לכתוב פונקציות של תור משימות, משתמשים בפונקציה onDispatch. חלק חשוב בכתיבת פונקציה של תור משימות הוא הגדרת ניסיון חוזר לכל תור והגבלת קצב. דוגמאות הקוד בדף הזה מבוססות על אפליקציה שמגדירה שירות שמגבה את כל התמונות מ-Astronomy Picture of the Day של נאס"א:

הגדרת פונקציות של תור משימות

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

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 משימות נשלחות בכל זמן נתון. כך אפשר להבטיח זרם קבוע של בקשות לפונקציה הבסיסית, ולצמצם את מספר המקרים הפעילים וההפעלות במצב התחלתי (cold start).

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

ברוב המקרים, Cloud Functionsהאמולטור הוא הדרך הכי טובה לבדוק פונקציות של תור משימות. במאמרי העזרה של כלים לאמולטור מוסבר איך לבצע אינסטרומנטציה באפליקציה לאמולציה של פונקציות של תור משימות.

בנוסף, פונקציות של תור משימות מוצגות כפונקציות HTTP פשוטות ב-Firebase Local Emulator Suite. אפשר לבדוק פונקציית משימה מדומה על ידי שליחת בקשת HTTP POST עם מטען ייעודי (payload) של נתוני 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 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: קוד לדוגמה שמנסה לפזר את הביצוע של משימות על ידי שיוך של עיכוב של N דקות למשימה ה-N. המשמעות היא הפעלה של משימה אחת בערך לדקה. שימו לב שאפשר להשתמש גם ב-scheduleTime אם רוצים שמשימה תופעל בזמן ספציפי.Cloud Tasks
  • dispatchDeadlineSeconds: משך הזמן המקסימלי ש-Cloud Tasks ימתין עד להשלמת משימה. ‫Cloud Tasks ינסה שוב לבצע את המשימה בהתאם להגדרת הניסיון החוזר של התור או עד שיגיע הדדליין הזה. בדוגמה, התור מוגדר לנסות לבצע את המשימה עד 5 פעמים, אבל המשימה מבוטלת אוטומטית אם התהליך כולו (כולל ניסיונות חוזרים) נמשך יותר מ-5 דקות.

פתרון בעיות

הפעלת רישום ביומן של Cloud Tasks

יומנים מ-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

הוראות להוספת חשבון השירות שמוגדר כברירת מחדל [App Engine] כמשתמש בחשבון השירות שמוגדר כברירת מחדל [App Engine] זמינות במאמרי העזרה של Google Cloud IAM.

gcloud functions add-iam-policy-binding $FUNCTION_NAME \
  --region=us-central1 \
  --member=serviceAccount:${PROJECT_ID}@appspot.gserviceaccount.com \
  --role=roles/cloudfunctions.invoker