בדף הזה מוסבר איך ליצור task handler, הקוד שמטפל במשימת push. צריך לספק רכיב לטיפול בבקשות כדי לעבד את המשימה. המיפוי מכתובת ה-URL של הבקשה ל-handler המתאים מוצהר ב-
app.yaml
של השירות, בדיוק כמו כל handler אחר של בקשות. אתם קובעים איך למפות בקשות למשימות לטיפול, ולכן אתם יכולים לארגן את המטפלים במשימות. אם האפליקציה שלכם מעבדת הרבה סוגים שונים של משימות, אתם יכולים להוסיף את כל ה-handlers לשירות אחד, או לחלק אותם בין כמה שירותים.
כתיבת handler לבקשת משימה מסוג push
בתור, שירות Task Queue יוצר כותרת HTTP ושולח אותה למופע של שירות העובד שצוין ביעד של המשימה. בקשות לתור משימות נשלחות מכתובת ה-IP 0.1.0.2.
ה-handler לא חייב להיכתב באותה שפה שבה נוצרה המשימה והוכנסה לתור, אם ה-handler נמצא בשירות נפרד.
כשכותבים את הפונקציה לטיפול בשגיאות, חשוב לפעול לפי ההנחיות הבאות:
הקוד צריך להחזיר קוד סטטוס של HTTP בטווח 200-299 כדי לציין הצלחה. כל קוד אחר מציין שהמשימה נכשלה.
למשימות מסוג Push יש מועד סיום קבוע, שנקבע בהתאם לסוג ההתאמה לגודל של השירות שמפעיל אותן. שירותי התאמה אוטומטית לעומס צריכים להסתיים לפני שיחלפו 10 דקות. שירותי התאמה ידנית ופשוטה של קנה המידה יכולים לפעול עד 24 שעות. אם ה-handler לא יסיים את העבודה בזמן, שירות Task Queue יניח שהמשימה נכשלה וינסה לבצע אותה שוב.
כשזמן הביצוע של משימה מתקרב למועד האחרון, App Engine מעלה את השגיאה
DeadlineExceededError(מהמודולgoogle.appengine.runtime) לפני שהמועד האחרון מגיע, כדי שתוכלו לשמור את העבודה או לרשום את ההתקדמות שהושגה.ה-handler צריך להיות אידמפוטנטי. ממשק ה-API של תור המשימות ב-App Engine נועד לספק מסירה של משימה 'לפחות פעם אחת'. כלומר, אם משימה נוספת בהצלחה, App Engine יעביר אותה ל-handler לפחות פעם אחת. הערה: בנסיבות נדירות, יכול להיות שיהיו כמה משימות שיופעלו בו-זמנית, ולכן הקוד צריך לוודא שלא יהיו תופעות לוואי מזיקות כתוצאה מהפעלה חוזרת.
מערכת Task Queue משתמשת בקוד ה-HTTP בתגובה של ה-handler כדי לקבוע אם המשימה הצליחה. התשובה מה-handler נראית רק לשירות Task Queue, ורק כדי לקבוע אם המשימה הצליחה. המערכת מתעלמת מכל שאר השדות בתגובה. לאחר מכן, התשובה נמחקת מהשירות. האפליקציה המקורית אף פעם לא מקבלת את הנתונים. אם משימה נכשלת, שירות Task Queue מנסה שוב לבצע את המשימה על ידי שליחת בקשה נוספת.
אפשר להעביר את הפרטים שהמשתמשים סיפקו ל-handler בבקשה כמחרוזת שאילתה או כמטען ייעודי (payload) בגוף הבקשה. הסבר על הוספת נתוני משתמשים מופיע במאמר בנושא יצירת משימות. אם הבקשה כוללת נתונים, ה-handler צריך לדעת איך הנתונים נוספו לבקשה. הקוד המדויק שמשמש לאחזור הנתונים מהבקשה תלוי במסגרת האינטרנט הספציפית שבה אתם משתמשים.
כדי לבדוק את המטפל במשימות, נכנסים לחשבון כאדמינים ומזינים את כתובת ה-URL של המטפל בדפדפן.
קריאת כותרות הבקשות
לבקשת HTTP של משימת Push יש כותרות מיוחדות שמוגדרות על ידי App Engine, שמכילות מידע ספציפי למשימה שהמטפל יכול להשתמש בו.
אם הכותרות האלה מופיעות בבקשה של משתמש חיצוני לאפליקציה, הן מוסרות ומוחלפות. החריג היחיד הוא בקשות מאדמינים שמחוברים לאפליקציה, שמורשים להגדיר כותרות למטרות בדיקה. לעומת זאת, הכותרות לא מוסרות כשהאפליקציה פועלת בשרת הפיתוח.
בקשות מ-Task Queue תמיד יכללו את הכותרות הבאות:
| כותרת | תיאור |
|---|---|
X-Appengine-QueueName |
השם של התור (יכול להיות default אם מדובר בתור דחיפה (push queue) ברירת המחדל). |
X-Appengine-TaskName |
שם המשימה, או מזהה ייחודי שנוצר על ידי המערכת אם לא צוין שם. |
X-Appengine-TaskRetryCount |
מספר הפעמים שהמשימה הזו נוסתה מחדש. בניסיון הראשון, הערך הוא 0. המספר הזה כולל ניסיונות שבהם המשימה נכשלה בגלל חוסר מופעים זמינים, ולא הגיעה לשלב הביצוע. |
X-Appengine-TaskExecutionCount |
מספר הפעמים שהמשימה הזו נכשלה בעבר במהלך שלב ההרצה. המספר הזה לא כולל כשלים שנובעים ממקרים שבהם לא היו מופעים זמינים. |
X-Appengine-TaskETA |
זמן הביצוע של המשימה, בשניות מאז 1 בינואר 1970. |
אם בקשות הטיפול שלכם מוצאות אחת מהכותרות שמפורטות למעלה, הן יכולות לסמוך על כך שהבקשה היא בקשה של Task Queue.
בנוסף, בקשות מ-Task Queue יכולות להכיל את הכותרות הבאות:
| כותרת | תיאור |
|---|---|
X-Appengine-TaskPreviousResponse |
קוד תגובת ה-HTTP מהניסיון הקודם. |
X-Appengine-TaskRetryReason |
הסיבה לניסיון החוזר של המשימה. |
X-Appengine-FailFast |
מציין שמשימה שפועלת תיכשל באופן מיידי אם מופע קיים לא יהיה זמין. |
אבטחת כתובות URL של handlers למשימות
אם משימה מבצעת פעולות רגישות (כמו שינוי נתונים), כדאי לאבטח את כתובת ה-URL של ה-handler כדי למנוע ממשתמש חיצוני זדוני לקרוא לה ישירות. אתם יכולים למנוע ממשתמשים לגשת לכתובות URL של משימות על ידי הגבלת הגישה לאדמינים של App Engine. בקשות המשימות עצמן מונפקות על ידי App Engine ותמיד יכולות להיות מכוונות לכתובת URL מוגבלת.
כדי להגביל כתובת URL, מוסיפים את הרכיב login: admin להגדרות של ה-handler בקובץ app.yaml.
לדוגמה:
handlers:
- url: /your-task
script: worker.app
login: admin