יצירת Task Handlers

בדף הזה מוסבר איך ליצור 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

המאמרים הבאים