הפונקציות של תור המשימות מנצלות את Cloud Tasks של Google כדי לעזור לאפליקציה להריץ משימות שדורשות זמן רב, משימות שצורכות הרבה משאבים או משימות עם מגבלת רוחב פס באופן אסינכרוני, מחוץ לתהליך העיבוד הראשי של האפליקציה.
לדוגמה, נניח שאתם רוצים ליצור גיבויים של קבוצה גדולה של קובצי תמונות שמתארחים כרגע ב-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.
יצירת פונקציות של רשימת משימות
כדי להשתמש בפונקציות של תור המשימות, פועלים לפי תהליך העבודה הבא:
- כתיבת פונקציה של תור המשימות באמצעות ה-SDK Firebase של Cloud Functions.
- כדי לבדוק את הפונקציה, מפעילים אותה באמצעות בקשת HTTP.
- פורסים את הפונקציה באמצעות ה-CLI של Firebase. כשפורסים את הפונקציה של תור המשימות בפעם הראשונה, ה-CLI יוצר תור משימות ב-Cloud Tasks עם אפשרויות (הגבלת קצב וניסיון חוזר) שצוינו בקוד המקור.
- מוסיפים משימות לתור המשימות החדש שנוצר, ומעבירים פרמטרים כדי להגדיר לוח זמנים לביצוע לפי הצורך. כדי לעשות זאת, כותבים את הקוד באמצעות Admin SDK ופורסים אותו ב-Cloud Functions for Firebase.
כתיבת פונקציות של תור משימות
כדי להתחיל לכתוב פונקציות של תורי משימות, אפשר להשתמש ב-onDispatch
. חלק חשוב בכתיבת פונקציה של תור המשימות הוא הגדרת ניסיונות חוזרים לכל תור והגדרות להגבלת קצב. דוגמאות הקוד בדף הזה מבוססות על אפליקציה שמגדירה שירות לגיבוי כל התמונות מ-Astronomy Picture of the Day של NASA:
הגדרת פונקציות של תור משימות
פונקציות של תור משימות מגיעות עם קבוצה חזקה של הגדרות אישיות, שמאפשרות לשלוט במדויק במגבלות הקצב ובהתנהגות של ניסיונות חוזרים של תור משימות:
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 הוא הדרך הטובה ביותר לבדוק פונקציות של תורים של משימות. במסמכי התיעוד של Emulator Suite מוסבר איך לספק לאפליקציה כלים להדמיה של פונקציות של תורי משימות.
בנוסף, הפונקציות של תור המשימות נחשפות כפונקציות 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
פריסת פונקציות של תור משימות
פורסים את הפונקציה של תור המשימות באמצעות ה-CLI של Firebase:
$ 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 דקות למשימה Nth. כלומר, הפעלה של כ-1 משימה לדקה. שימו לב שאפשר להשתמש גם ב-scheduleTime
אם רוצים ש-Cloud Tasks יפעיל משימה בזמן מסוים.dispatchDeadlineSeconds
: משך הזמן המקסימלי ש-Cloud Tasks ימתין להשלמת המשימה. Cloud Tasks ינסה שוב את המשימה בהתאם להגדרות הניסיון החוזר של התור, או עד שיגיע למועד היעד הזה. בדוגמה, התור מוגדר לנסות שוב את המשימה עד 5 פעמים, אבל המשימה מבוטלת באופן אוטומטי אם התהליך כולו (כולל ניסיונות חוזרים) נמשך יותר מ-5 דקות.
פתרון בעיות
Cloud Tasks">הפעלת הרישום ביומן של Cloud Tasks
היומנים מ-Cloud Tasks מכילים מידע שימושי לאבחון, כמו סטטוס הבקשה שמשויכת למשימה. כברירת מחדל, יומנים מ-Cloud Tasks מושבתים בגלל הכמות הגדולה של יומנים שהם עלולים ליצור בפרויקט. מומלץ להפעיל את יומני ניפוי הבאגים בזמן פיתוח הפונקציות של תור המשימות וניפוי באגים. איך מפעילים את הרישום ביומן
הרשאות IAM
יכול להיות שתראו שגיאות מסוג PERMISSION DENIED
כשאתם מוסיפים משימות לתור או כש-Cloud Tasks מנסה להפעיל את הפונקציות של תור המשימות. מוודאים שהפרויקט כולל את קישורי ה-IAM הבאים:
הזהות שמשמשת להעברת משימות לתור ל-Cloud Tasks צריכה להיות הרשאת
cloudtasks.tasks.create
ב-IAM.בדוגמה, זהו חשבון השירות שמוגדר כברירת מחדל App Engine
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member=serviceAccount:${PROJECT_ID}@appspot.gserviceaccount.com \
--role=roles/cloudtasks.enqueuer
לזהות שמשמשת להוספת משימות לתור ב-Cloud Tasks צריכה להיות הרשאה להשתמש בחשבון השירות שמשויך למשימה ב-Cloud Tasks.
בדוגמה, זהו חשבון השירות שמוגדר כברירת מחדל App Engine.
הוראות להוספת חשבון השירות App Engine שמוגדר כברירת מחדל כמשתמש בחשבון השירות App Engine שמוגדר כברירת מחדל מפורטות במסמכי העזרה של Google Cloud IAM.
הזהות ששימשה להפעלת פונקציית תור המשימות צריכה את ההרשאה
cloudfunctions.functions.invoke
.בדוגמה, זהו חשבון השירות שמוגדר כברירת מחדל App Engine
gcloud functions add-iam-policy-binding $FUNCTION_NAME \
--region=us-central1 \
--member=serviceAccount:${PROJECT_ID}@appspot.gserviceaccount.com \
--role=roles/cloudfunctions.invoker