בדף הזה מוסבר מהם תורי משימות, ומתי ואיך להשתמש בהם. תורי משימות מאפשרים לאפליקציות לבצע עבודה, שנקראת משימות, באופן אסינכרוני מחוץ לבקשת משתמש. אם אפליקציה צריכה לבצע עבודה ברקע, היא מוסיפה משימות לתורי משימות. המשימות מבוצעות בשלב מאוחר יותר על ידי שירותי worker.
שירות תור המשימות מיועד לעבודה אסינכרונית. הוא לא מספק הבטחות חזקות לגבי התזמון של מסירת המשימות, ולכן הוא לא מתאים לאפליקציות אינטראקטיביות שבהן המשתמש מחכה לתוצאה.
תורים לדחיפה ותורים לשליפה
יש שני סוגים של תורי משימות: push ו-pull. האופן שבו שירות Task Queue שולח בקשות למשימות לשירותי worker שונה בתורים שונים.
תורים של דחיפת הודעות מריצים משימות על ידי העברת בקשות HTTP לשירותי worker של App Engine. הם שולחים את הבקשות האלה בקצב אמין ויציב ומבטיחים ביצוע אמין של המשימות. אתם יכולים לשלוט בקצב שבו המשימות נשלחות מהתור, ולכן אתם יכולים לשלוט בהתנהגות של שינוי הגודל של העובדים, וכך גם בעלויות.
מכיוון שהמשימות מבוצעות כבקשות שמיועדות לשירותים של App Engine, הן כפופות למועדים קפדניים. משימות שמטופלות על ידי שירותי שינוי גודל אוטומטי חייבות להסתיים תוך עשר דקות. משימות שמטופלות על ידי שירותי שינוי גודל בסיסיים וידניים יכולות לפעול עד 24 שעות.
תורי משימות מסוג pull לא מתבצעת הקצאה של משימות. הם תלויים בשירותים אחרים של worker כדי 'לשכור' משימות מהתור ביוזמתם. תורי משימות מסוג pull מעניקים לכם יותר שליטה וגמישות לגבי מתי ואיפה המשימות מעובדות, אבל הם גם דורשים מכם לבצע יותר ניהול של תהליכים. כשמשימה מושכרת, ה-worker ששכר אותה מכריז על תאריך יעד. עד שתאריך היעד יגיע, ה-worker חייב להשלים את המשימה ולמחוק אותה, אחרת שירות Task Queue יאפשר ל-worker אחר לשכור אותה.
כל המשימות בתור המשימות מבוצעות באופן אסינכרוני. האפליקציה שיוצרת את המשימה מעבירה אותה לתור. האפליקציה המקורית לא מקבלת הודעה אם המשימה הושלמה או לא, או אם היא הצליחה.
אם עובד לא מצליח לעבד משימה, שירות תור המשימות מספק לתור מנגנון ניסיון חוזר, כך שאפשר לנסות לבצע את המשימה מספר סופי של פעמים.
תרחישים לדוגמה
תורים להעברת נתונים
תרחיש שימוש אופייני בתור לדחיפה הוא פעולה 'איטית'. נניח שיש מערכת הודעות ברשת חברתית. בכל פעם שמשתמש שולח הודעה, הרשת צריכה לעדכן את העוקבים של השולח. זו יכולה להיות פעולה שלוקחת הרבה זמן. באמצעות תור לדחיפה, האפליקציה יכולה להוסיף למשימה תור לכל הודעה כשהיא מגיעה כדי לשלוח אותה לשירות של עובד לצורך עיבוד. כשהעובד מקבל את בקשת המשימה, הוא יכול לאחזר את רשימת העוקבים של השולח ולעדכן את מסד הנתונים עבור כל אחד מהם. אפשר להפוך את העובד ליעיל עוד יותר על ידי הוספת משימת דחיפה נוספת לתור לכל עדכון של מסד הנתונים.
שימוש נוסף בתורי דחיפה (push queue) הוא משימות מתוזמנות. נניח שיש אפליקציה שמטמיעה קמפיין פרסום. אפשר להוסיף קבוצה של משימות שנכתבו לשליחת אימיילים לתור דחיפה (push queue) עם הוראות להשהיית המשימות עד למועד מסוים בעתיד. כשתאריך היעד יגיע, שירות תור משימות יתחיל להנפיק בקשות להפעלת המשימות.
תורים של משיכות
תורי משימות מסוג pull מתאימים במיוחד כשצריך לקבץ משימות כדי לבצע אותן בצורה יעילה. פתרון אחד הוא לנצל את האפשרות לצרף תג למשימת pull. תהליך העבודה יכול לשכור קבוצה של משימות עם אותו תג. דוגמה אופיינית היא אפליקציה שמנהלת לידרבורדים למשחקים שונים רבים, עם הרבה שחקנים וקבוצות שמשחקים כל הזמן. בכל פעם שיש שיא חדש, האפליקציה יכולה להוסיף לתור משימת pull עם הניקוד והשחקן, ולהשתמש במזהה המשחק כתג משימה. תהליך העבודה מתעורר מדי פעם, שוכר קבוצה של משימות עם אותו מזהה משחק ומעדכן את הלידרבורד. אפשר לשכור משימות באופן מפורש, באמצעות ערך תג שצוין, או לאפשר לשירות להחליט איזו קבוצה של משימות עם תגים דומים לשלוח.
שימוש בתגים כדי לבצע פעולות בקבוצות יכול להיות יעיל מאוד. מכיוון שאפשר ליצור תגים באופן דינמי בזמן שהאפליקציה פועלת, תהליך worker יכול לטפל במזהי משחקים חדשים בלי מאמץ מיוחד.
המאמרים הבאים
- מידע נוסף על תורים של הודעות בדחיפה
- מידע נוסף על תורים של בקשות משיכה