באמצעות Cloud Tasks אפשר לנהל את ביצוע המשימות על ידי הגדרת ניתוב, מגבלות על קצב השליחה והתנהגות ניסיון חוזר ברמת התור. אפשר להגדיר את ההגדרות האלה כשיוצרים תור או כשמעדכנים תור קיים. דגלי ההגדרה שבהם משתמשים gcloud tasks queues create או gcloud tasks queues update זהים.
הגדרת אימות ברמת התור מבטלת את האימות ברמת המשימה. למידע נוסף, ראו שימוש במשימות של HTTP Target עם אסימוני אימות.
הגדרה של ניתוב ברמת התור
הגדרת ניתוב ברמת התור מחליפה את הניתוב שנקבע ברמת המשימה. האפשרות הזו שימושית אם רוצים להשתמש ב-Cloud Tasks כמאגר זמני לפני שירות היעד, או אם צריך לשנות את הניתוב של כל המשימות בתור.
ניתוב ברמת התור חל על:
- משימות שנמצאות בתור
- משימות שנוספו לתור אחרי שהוגדר ניתוב ברמת התור
מגבלות
ניתוב ברמת התור לא תואם למפתחות הצפנה בניהול הלקוח (CMEK) של Cloud Key Management Service (Cloud KMS). אם CMEK מופעל, אי אפשר לבצע את הפעולות הבאות:
- יצירת משימות ברשימת 'הבאים בתור' עם ניתוב ברמת הרשימה
- החלת ניתוב ברמת התור
הגדרת ניתוב ברמת התור למשימות HTTP
אפשר להגדיר תור שיעקוף את הניתוב ברמת המשימה כשיוצרים את התור או כשמעדכנים אותו. כדי להגדיר ניתוב ברמת התור, מגדירים את הפרמטר uriOverride של התור למסלול המועדף.
אם אתם מפעילים ניתוב ברמת התור כעדכון לתור קיים, צריך להשהות את התור לפני שמחילים את השינויים, ולהמתין דקה אחרי החלת השינויים לפני שממשיכים את התור.
להשהות את התור מריצים את הפקודה הבאה:
gcloud tasks queues pause QUEUE_ID
מחליפים את
QUEUE_IDבמזהה התור.עדכון או הסרה של ניתוב ברמת התור.
כדי לעדכן את הניתוב ברמת התור, מגדירים את הפרמטר
uriOverrideלמסלול המעודכן.כדי להסיר ניתוב ברמת התור באמצעות API ל-REST או API ל-RPC:
API בארכיטקטורת REST: שולחים בקשת
patchלתור עם מטען ייעודי (payload) ריק והפרמטרupdateMaskמוגדר לערךhttpTarget.RPC API: שולחים
updateQueueRequestלתור עם מטען ייעודי ריק והפרמטרupdate_maskמוגדר לערךhttp_target.
בדוגמה הבאה נעשה שימוש ב-API בארכיטקטורת REST כדי לעדכן את המארח שאליו מנותבות המשימות:
curl -X PATCH -d @- -i \ -H "Authorization: Bearer ACCESS_TOKEN" \ -H "Content-Type: application/json" \ "https://cloudtasks.googleapis.com/v2/projects/PROJECT_ID/locations/LOCATION/queues/QUEUE_ID?updateMask=httpTarget.uriOverride" << EOF { "httpTarget": {"uriOverride":{"host":"NEW_HOST"}} } EOFמחליפים את מה שכתוב בשדות הבאים:
ACCESS_TOKEN: אסימון הגישה. אפשר לקבל את זה על ידי הרצת הפקודה הבאה במסוף:gcloud auth application-default login gcloud auth application-default print-access-token
PROJECT_ID: מזהה הפרויקט ב- Google Cloud . כדי לקבל את המידע הזה, מריצים את הפקודה הבאה בטרמינל:gcloud config get-value project
LOCATION: המיקום של התור.
NEW_HOST: המארח החדש שאליו רוצים להפנות את התור.
מחכים דקה.
יכול להיות שיחלפו עד דקה עד שההגדרה החדשה תיכנס לתוקף. המתנה לפני חידוש התור עוזרת למנוע שליחה של משימות עם ההגדרה הישנה.
כדי להמשיך את התור, מריצים את הפקודה הבאה:
gcloud tasks queues resume QUEUE_ID
הגדרת ניתוב ברמת התור למשימות App Engine
כדי להגדיר ניתוב ברמת התור למשימות של App Engine, מגדירים את הפרמטר appEngineRoutingOverride של התור לשירות ולגרסה המועדפים של App Engine.
הגדרה של ניתוב ברמת התור וביטול של ניתוב ברמת המשימה:
gcloud tasks queues update QUEUE_ID \ --routing-override=service:SERVICE,version:VERSION
מחליפים את מה שכתוב בשדות הבאים:
-
QUEUE_ID: מזהה התור (השם הקצר שלו). -
SERVICE: שירות העובדים של App Engine שאחראי לטיפול במשימות. -
VERSION: גרסת האפליקציה.
לדוגמה, אם הגדרתם שירות עובדים לטיפול בכל המשימות בתור, תוכלו להפנות לשירות הזה ולגרסת ברירת המחדל:
gcloud tasks queues update QUEUE_ID \ --routing-override=service:SERVICE
-
כדי לוודא שהתור הוגדר בהצלחה, מריצים את הפקודה הבאה:
gcloud tasks queues describe QUEUE_ID --location=LOCATION
מחליפים את
LOCATIONבמיקום של התור.הפלט אמור להיראות כך:
appEngineRoutingOverride: host: SERVICE.PROJECT_ID.appspot.com service: SERVICE name: projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID rateLimits: maxBurstSize: 100 maxConcurrentDispatches: 1000 maxDispatchesPerSecond: 500.0 retryConfig: maxAttempts: 100 maxBackoff: 3600s maxDoublings: 16 minBackoff: 0.100s state: RUNNING
כדי להסיר ניתוב ברמת התור, מריצים את הפקודה הבאה:
gcloud tasks queues update QUEUE_ID \ --clear-routing-override
כשמסירים את הניתוב ברמת התור, הניתוב ברמת המשימה חל על משימות בתור ועל משימות שיתווספו לתור בעתיד.
הגדרת מגבלות קצב
מגבלת הקצב קובעת את הקצב המקסימלי שבו אפשר לשלוח משימות מתור, בלי קשר לשאלה אם השליחה היא ניסיון ראשון או ניסיון חוזר.
כדי להגדיר את השיעור המקסימלי ואת מספר המשימות המקבילות שאפשר לשלוח מתור, מריצים את הפקודה הבאה:
gcloud tasks queues update QUEUE_ID \ --max-dispatches-per-second=DISPATCH_RATE \ --max-concurrent-dispatches=MAX_CONCURRENT_DISPATCHES
מחליפים את מה שכתוב בשדות הבאים:
-
QUEUE_ID: מזהה התור (השם הקצר שלו). -
DISPATCH_RATE: תעריף המשלוח. זהו שיעור הרענון של האסימונים בדלי. בתנאים שבהם יש זרימה יציבה יחסית של משימות, זה שווה לקצב שבו המשימות נשלחות. -
MAX_CONCURRENT_DISPATCHES: המספר המקסימלי של משימות בתור שיכולות לפעול בו-זמנית.
לדוגמה, אם יצרתם תור בלי להגדיר פרמטרים, אתם יכולים לעדכן את המספר המקסימלי של משימות מקבילות באמצעות הפקודה הבאה:
gcloud tasks queues update QUEUE_ID \ --max-concurrent-dispatches=MAX_CONCURRENT_DISPATCHES
-
כדי לוודא שהתור הוגדר בהצלחה, מריצים את הפקודה הבאה:
gcloud tasks queues describe QUEUE_ID --location=LOCATION
מחליפים את
LOCATIONבמיקום של התור.הפלט אמור להיראות כך:
name: projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID rateLimits: maxBurstSize: 100 maxConcurrentDispatches: MAX_CONCURRENT_DISPATCHES maxDispatchesPerSecond: 500.0 retryConfig: maxAttempts: 100 maxBackoff: 3600s maxDoublings: 16 minBackoff: 0.100s state: RUNNING
שיטות להגדרת קצב העיבוד של התור
אפשר להגדיר את קצב העיבוד של התור באמצעות Cloud Tasks API או באמצעות העלאה של קובץ queue.yaml. שתי השיטות יוצרות תורים שמשתמשים באותו מנגנון בסיסי.
בשני המקרים, התור משתמש באלגוריתם token bucket כדי לשלוט בקצב הביצוע של המשימות. לכל תור עם שם יש מאגר שאוגר את האסימונים שלו.
בכל פעם שהאפליקציה מבצעת משימה, טוקן מוסר מהדלי.
התור ממשיך לעבד משימות עד שמאגר האסימונים שלו מתרוקן. המערכת ממלאת מחדש את המאגר באסימונים חדשים באופן רציף על סמך הקצב max_dispatches_per_second שציינתם לתור. אם התור שלכם מכיל משימות לעיבוד, והקטגוריה של התור מכילה טוקנים, המערכת מעבדת בו-זמנית את כל המשימות שיש להן טוקנים, עד לערך max_concurrent_dispatches שהגדרתם.
עומס לא אחיד יכול לגרום למספר האסימונים בדלי לגדול באופן משמעותי, מה שעלול להוביל לעיבוד מהיר של בקשות כשמגיעה כמות גדולה של בקשות. במקרה כזה, יכול להיות שקצב השליחה בפועל של התור יהיה גבוה מקצב max_dispatches_per_second, מה שיגרום לצריכת משאבי מערכת ולהתחרות עם בקשות להצגת מודעות למשתמשים. במקרים שבהם משתמשים בתורים כדי לנהל את שיעורי השליחה על סמך הסכמי רמת שירות (SLA) איטיים יחסית לשירותים במורד הזרם, זה עלול להוביל לשגיאות כמו HTTP 429 (יותר מדי בקשות) או HTTP 503 (השירות לא זמין).
כשמשתמשים ב-method כלשהי של Cloud Tasks API, יש שני שדות שבהם אפשר להגדיר את קצב השליחה של התור:
max_dispatches_per_secondmax_concurrent_dispatches
השדה השלישי,
max_burst_size, מחושב על ידי המערכת על סמך הערך שהגדרתם בשדהmax_dispatches_per_second. מידע נוסף זמין במאמר בנושא הודעותRateLimits.כשמשתמשים ב
queue.yamlmethod, אפשר להגדיר את כל שלושת הרכיבים:-
max_concurrent_requests, ששווה ל-max_concurrent_dispatches -
rate, ששווה ל-max_dispatches_per_second -
bucket_size, ששווה ל-max_burst_size
-
ברוב המקרים, שימוש בשיטת Cloud Tasks API והגדרה של max_burst_size על ידי המערכת יוצרים קצב יעיל מאוד לניהול של פרצי בקשות. עם זאת, במקרים מסוימים, במיוחד כשנדרש קצב איטי יחסית, אפשר לקבל יותר שליטה באמצעות שימוש בשיטה queue.yaml כדי להגדיר ידנית את bucket_size לערך קטן, או באמצעות הגדרת max_concurrent_dispatches לערך קטן באמצעות Cloud Tasks API.
הגדרת פרמטרים של ניסיון חוזר
אם משימה לא הושלמה בהצלחה, Cloud Tasks מנסה לבצע אותה שוב עם השהיה מעריכית לפני ניסיון חוזר (exponential backoff) בהתאם לפרמטרים שהגדרתם. אחרי שמשימה מבוצעת בהצלחה, היא מוסרת מהתור. בכל המקרים, חלה גם מגבלת השמירה המקסימלית של משימות.
אפשר גם לציין הגדרת ניסיון חוזר ברמת המשימה, שתחליף את הגדרת הניסיון החוזר ברמת התור עבור המשימה. מידע נוסף זמין במאמר בנושא הגדרת פרמטרים של ניסיון חוזר למשימה.
כדי לציין את המספר המקסימלי של פעמים לניסיון חוזר של משימות שנכשלו בתור, להגדיר מגבלת זמן לניסיונות חוזרים ולשלוט במרווח הזמן בין הניסיונות, מריצים את הפקודה הבאה:
gcloud tasks queues update QUEUE_ID \ --max-attempts=MAX_ATTEMPTS \ --max-retry-duration=MAX_RETRY_DURATION \ --min-backoff=MIN_INTERVAL \ --max-backoff=MAX_INTERVAL \ --max-doublings=MAX_DOUBLINGS
מחליפים את מה שכתוב בשדות הבאים:
-
QUEUE_ID: מזהה התור (השם הקצר שלו). -
MAX_ATTEMPTS: המספר המקסימלי של הניסיונות לביצוע משימה, כולל הניסיון הראשון. כדי לאפשר ניסיונות חוזרים ללא הגבלה, מגדירים את הערך-1.MAX_RETRY_DURATIONעדיין חל גם אם מגיעים לMAX_ATTEMPTSאו אם הוא מוגדר ל-1. -
MAX_RETRY_DURATION: משך הזמן המקסימלי לניסיון חוזר של משימה שנכשלה, שנמדד מהניסיון הראשון לבצע את המשימה. הערך חייב להיות מחרוזת שמסתיימת ב-s, כמו5s. כדי לציין משך זמן בלתי מוגבל, מגדירים את הערך0s.MAX_ATTEMPTSעדיין חל גם אם מגיעים ל-MAX_RETRY_DURATIONאו אם הוא מוגדר ל-0s.
-
MIN_INTERVAL: משך הזמן המינימלי להמתנה בין ניסיונות חוזרים. הערך חייב להיות מחרוזת שמסתיימת ב-s, למשל5s. -
MAX_INTERVAL: משך הזמן המקסימלי להמתנה בין ניסיונות חוזרים. הערך חייב להיות מחרוזת שמסתיימת ב-s, למשל5s.
MAX_DOUBLINGS: המספר המקסימלי של הפעמים שבהן המרווח בין ניסיונות חוזרים של משימה שנכשלה יוכפל לפני שההגדלה תהפוך לקבועה. מרווח הזמן בין ניסיונות חוזרים של משימה מתחיל ב-MIN_INTERVAL, מוכפלMAX_DOUBLINGSפעמים, ואז גדל באופן ליניארי. לבסוף, המערכת מנסה שוב במרווחים שלMAX_INTERVALעדMAX_ATTEMPTSפעמים.לדוגמה, אם
MIN_INTERVALהוא10s,MAX_INTERVALהוא300sו-MAX_DOUBLINGSהוא3, מרווח הניסיון החוזר יוכפל3פעמים, יגדל באופן ליניארי ב-2^3 * 10s, ואז יתבצע ניסיון חוזר במרווחים שלMAX_INTERVALעד שהמשימה תנסהMAX_ATTEMPTSפעמים: 10 שניות, 20 שניות, 40 שניות, 80 שניות, 160 שניות, 240 שניות, 300 שניות וכן הלאה.
-
פרטים נוספים על הפרמטרים זמינים בהגדרות של RetryConfig עבור המשאב Queue.
כדי לוודא שהתור הוגדר בהצלחה, מריצים את הפקודה הבאה:
gcloud tasks queues describe QUEUE_ID --location=LOCATION
מחליפים את
LOCATIONבמיקום של התור.הפלט צריך לכלול את פרמטרי הניסיון החוזר שהגדרתם.
המאמרים הבאים
- מידע על יצירת משימות של HTTP Target
- מידע על יצירת משימות ב-App Engine
- מידע נוסף על ניהול תורים זמין בהפניה ל-RPC API.
- מידע נוסף על ניהול תורים מופיע במאמרי העזרה של ה-API בארכיטקטורת REST.