בדף הזה מוסבר איך להגדיר ניסיון חוזר אוטומטי של משימות אחרי שחלק מהן נכשלו או אחרי שכולן נכשלו.
משימה באצווה נכשלת אם לפחות אחת מהמשימות שלה נכשלת, וזה יכול לקרות מסיבות שונות. כברירת מחדל, כל משימה בעבודה מופעלת רק פעם אחת. אם משימה נכשלת, לא מתבצע ניסיון חוזר להפעיל אותה. עם זאת, יש בעיות שגורמות לכך שמשימה נכשלת, שאפשר לפתור בקלות פשוט על ידי ניסיון חוזר של המשימה. במקרים כאלה, הגדרת העבודה כך שתנסה לבצע מחדש משימות באופן אוטומטי יכולה לעזור באופן משמעותי לצמצם את החיכוך בתהליך פתרון הבעיות ואת זמן הריצה הכולל של העבודות.
ניסיונות חוזרים אוטומטיים מתאימים במיוחד למשימות עם צימוד רופף (משימות עצמאיות) ויכולים לעזור במגוון בעיות. לדוגמה, ניסיונות חוזרים אוטומטיים לביצוע משימות יכולים לפתור בעיות שרגישות לזמן, כמו:
- הפסקת השימוש במכונות וירטואליות במודל Spot
- אירועי תחזוקה של מכונות וירטואליות ושגיאות במארח
- שגיאות חולפות ברשת
כשיוצרים עבודה, אפשר להגדיר ניסיונות חוזרים אוטומטיים לכל משימה. במיוחד, לכל משימה, אפשר להשתמש באחת מאפשרויות ההגדרה הבאות:
- כברירת מחדל, לא מתבצע ניסיון חוזר לביצוע של משימה שנכשלה.
- ניסיון חוזר של משימות לכל הכשלים: אתם יכולים להגדיר את מספר הפעמים המקסימלי לניסיון חוזר אוטומטי של משימות שנכשלו. אפשר לציין בין 0 (ברירת מחדל) ל-10 ניסיונות חוזרים.
- ניסיון חוזר של משימות במקרים מסוימים של כשל: אפשר להגדיר פעולות שונות למשימות – ניסיון חוזר אוטומטי או כשל ללא ניסיון חוזר – במקרים ספציפיים של כשל. הפעולה ההפוכה מתבצעת לכל הכשלים שלא צוינו. כל כשל ספציפי יכול להיות מזוהה על ידי קוד יציאה שמוגדר על ידי האפליקציה או על ידי Batch.
לפני שמתחילים
- אם עוד לא השתמשתם ב-Batch, כדאי לעיין במאמר תחילת העבודה עם Batch ולהפעיל את Batch על ידי השלמת הדרישות המוקדמות לפרויקטים ולמשתמשים.
-
כדי לקבל את ההרשאות שדרושות ליצירת משימה, אתם צריכים לבקש מהאדמין להקצות לכם את תפקידי ה-IAM הבאים:
- הכלי לעריכת משימות באצווה (
roles/batch.jobsEditor) בפרויקט - משתמש בחשבון שירות (
roles/iam.serviceAccountUser) בחשבון השירות של המשימה, שמוגדר כברירת מחדל כחשבון השירות של Compute Engine שמוגדר כברירת מחדל
להסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.
יכול להיות שאפשר לקבל את ההרשאות הנדרשות גם באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש.
- הכלי לעריכת משימות באצווה (
ניסיון חוזר של משימות לכל הכישלונות
אפשר להגדיר את המספר המקסימלי של ניסיונות חוזרים אוטומטיים (השדה maxRetryCount) למשימות שנכשלו בעבודה באמצעות ה-CLI של gcloud או Batch API.
gcloud
יוצרים קובץ JSON שמציין את פרטי ההגדרה של העבודה ואת השדה
maxRetryCount.לדוגמה, כדי ליצור עבודת סקריפט בסיסית שמציינת את מספר הניסיונות החוזרים המקסימלי למשימות שנכשלו, יוצרים קובץ JSON עם התוכן הבא:
{ "taskGroups": [ { "taskSpec": { "runnables": [ { "script": { "text": "echo Hello world from task ${BATCH_TASK_INDEX}" } } ], "maxRetryCount": MAX_RETRY_COUNT }, "taskCount": 3 } ], "logsPolicy": { "destination": "CLOUD_LOGGING" } }מחליפים את
MAX_RETRY_COUNTבמספר המקסימלי של ניסיונות חוזרים לכל משימה. כדי שמשימה תוכל לנסות שוב לבצע משימות שנכשלו, הערך הזה צריך להיות מספר שלם בין1ל-10. אם לא מציינים את השדהmaxRetryCount, ערך ברירת המחדל הוא0, כלומר לא יתבצע ניסיון חוזר של אף משימה.כדי ליצור ולהריץ את העבודה, משתמשים בפקודה
gcloud batch jobs submit:gcloud batch jobs submit JOB_NAME \ --location LOCATION \ --config JSON_CONFIGURATION_FILEמחליפים את מה שכתוב בשדות הבאים:
JOB_NAME: שם המשימה.
LOCATION: המיקום של המשרה.
JSON_CONFIGURATION_FILE: הנתיב לקובץ JSON עם פרטי ההגדרות של העבודה.
API
שולחים בקשת POST אל ה-method jobs.create ומציינים את השדה maxRetryCount.
לדוגמה, כדי ליצור משימת סקריפט בסיסית שמציינת את מספר הניסיונות החוזרים המקסימלי למשימות שנכשלו, שולחים את הבקשה הבאה:
POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/jobs?job_id=JOB_NAME
{
"taskGroups": [
{
"taskSpec": {
"runnables": [
{
"script": {
"text": "echo Hello world from task ${BATCH_TASK_INDEX}"
}
}
],
"maxRetryCount": MAX_RETRY_COUNT
},
"taskCount": 3
}
],
"logsPolicy": {
"destination": "CLOUD_LOGGING"
}
}
מחליפים את מה שכתוב בשדות הבאים:
PROJECT_ID: מזהה הפרויקט שלכם.
LOCATION: המיקום של המשרה.
JOB_NAME: שם המשימה.
MAX_RETRY_COUNT: המספר המקסימלי של ניסיונות חוזרים לכל משימה. כדי שמשימה תוכל לנסות שוב לבצע משימות שנכשלו, הערך הזה צריך להיות מספר שלם בין1ל-10. אם לא מציינים את השדהmaxRetryCount, ערך ברירת המחדל הוא0, כלומר לא יתבצע ניסיון חוזר של אף משימה.
ניסיון חוזר של משימות במקרים מסוימים של כשל
אפשר להגדיר איך רוצים שהעבודה תטפל בכשלים שונים במשימות באמצעות מדיניות מחזור חיים (השדה lifecyclePolicies[]).
מדיניות מחזור חיים מורכבת מפעולה (שדה action), תנאי פעולה (שדה actionCondition) וקוד יציאה (שדה exitCodes[]).
הפעולה שצוינה מתבצעת בכל פעם שתנאי הפעולה – קוד יציאה ספציפי – מתרחש.
אפשר לציין אחת מהפעולות הבאות:
-
RETRY_TASK: מנסה שוב לבצע משימות שנכשלו עם קודי היציאה שצוינו בשדהexitCodes[]. משימות שנכשלות עם קודי יציאה לא מוגדרים לא ינסו להפעיל מחדש. -
FAIL_TASK: לא מנסים שוב לבצע משימות שנכשלו עם קודי היציאה שצוינו בשדהexitCodes[]. משימות שנכשלות עם קודי יציאה לא ספציפיים ינסו שוב.
חשוב לציין: אם משימות נכשלות עם קודי יציאה לא מוגדרים, מתבצעת הפעולה ההפוכה – חלק מקודי היציאה מנסים שוב וחלק נכשלים.
לכן, כדי שמדיניות מחזור החיים תפעל כמצופה, צריך גם להגדיר את המספר המקסימלי של ניסיונות חוזרים אוטומטיים (שדה maxRetryCount) כדי לאפשר למשימה לנסות שוב באופן אוטומטי משימות שנכשלו לפחות פעם אחת.
כל קוד יציאה מייצג כשל ספציפי שהוגדר על ידי האפליקציה או על ידי Batch. קודי היציאה מ-50001 עד 59999 שמורים ומוגדרים על ידי Batch. מידע נוסף על קודי היציאה השמורים זמין במאמר בנושא פתרון בעיות.
אתם יכולים לציין אם משימות ינסו שוב או ייכשלו אחרי כשלים ספציפיים בעזרת ה-CLI של gcloud או Batch API.
gcloud
יוצרים קובץ JSON שמציין את פרטי ההגדרה של העבודה, השדה
maxRetryCountושדות המשנהlifecyclePolicies[].כדי ליצור עבודת סקריפט בסיסית שמנסה שוב לבצע משימות שנכשלו רק עבור חלק מקודי היציאה, יוצרים קובץ JSON עם התוכן הבא:
{ "taskGroups": [ { "taskSpec": { "runnables": [ { "script": { "text": "echo Hello world from task ${BATCH_TASK_INDEX}" } } ], "maxRetryCount": MAX_RETRY_COUNT, "lifecyclePolicies": [ { "action": "ACTION", "actionCondition": { "exitCodes": [EXIT_CODES] } } ] } } ], "logsPolicy": { "destination": "CLOUD_LOGGING" } }מחליפים את מה שכתוב בשדות הבאים:
MAX_RETRY_COUNT: המספר המקסימלי של ניסיונות חוזרים לכל משימה. כדי שמשימה תוכל לנסות שוב לבצע משימות שנכשלו, הערך הזה צריך להיות מספר שלם בין1ל-10. אם לא מציינים את השדהmaxRetryCount, ערך ברירת המחדל הוא0, כלומר לא יתבצע ניסיון חוזר של אף משימה.
ACTION: הפעולה,RETRY_TASKאוFAIL_TASK, שרוצים שתתבצע במשימות שנכשלו עם קודי היציאה שצוינו. משימות שנכשלות עם קודי יציאה לא מוגדרים יבצעו את הפעולה השנייה.
EXIT_CODES: רשימה מופרדת בפסיקים של קוד יציאה אחד או יותר שרוצים להגדיר שיפעילו את הפעולה שצוינה. לדוגמה,50001, 50002.כל קוד יציאה יכול להיות מוגדר על ידי האפליקציה או על ידי Batch. קודי היציאה מ-
50001עד59999שמורים ל-Batch. מידע נוסף על קודי היציאה השמורים זמין במאמר בנושא פתרון בעיות.
לדוגמה, העבודה הבאה מנסה לבצע מחדש רק משימות שנכשלו בגלל הקדימות של מכונות וירטואליות מסוג Spot.
{ "taskGroups": [ { "taskSpec": { "runnables": [ { "script": { "text": "sleep 30" } } ], "maxRetryCount": 3, "lifecyclePolicies": [ { "action": "RETRY_TASK", "actionCondition": { "exitCodes": [50001] } } ] } } ], "allocationPolicy": { "instances": [ { "policy": { "machineType": "e2-standard-4", "provisioningModel": "SPOT" } } ] } }כדי ליצור ולהריץ את העבודה, משתמשים בפקודה
gcloud batch jobs submit:gcloud batch jobs submit JOB_NAME \ --location LOCATION \ --config JSON_CONFIGURATION_FILEמחליפים את מה שכתוב בשדות הבאים:
JOB_NAME: שם המשימה.
LOCATION: המיקום של המשרה.
JSON_CONFIGURATION_FILE: הנתיב לקובץ JSON עם פרטי ההגדרות של העבודה.
API
שולחים בקשת POST ל-method jobs.create עם השדה maxRetryCount ושדות המשנה lifecyclePolicies[].
כדי ליצור משימת סקריפט בסיסית שמבצעת ניסיון חוזר למשימות שנכשלו רק עבור קודי יציאה מסוימים, שולחים את הבקשה הבאה:
POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/jobs?job_id=JOB_NAME
{
"taskGroups": [
{
"taskSpec": {
"runnables": [
{
"script": {
"text": "echo Hello world from task ${BATCH_TASK_INDEX}"
}
}
],
"maxRetryCount": MAX_RETRY_COUNT,
"lifecyclePolicies": [
{
"action": "ACTION",
"actionCondition": {
"exitCodes": [EXIT_CODES]
}
}
]
}
}
],
"logsPolicy": {
"destination": "CLOUD_LOGGING"
}
}
מחליפים את מה שכתוב בשדות הבאים:
PROJECT_ID: מזהה הפרויקט שלכם.
LOCATION: המיקום של המשרה.
JOB_NAME: שם המשימה.
MAX_RETRY_COUNT: המספר המקסימלי של ניסיונות חוזרים לכל משימה. כדי שמשימה תוכל לנסות שוב לבצע משימות שנכשלו, הערך הזה צריך להיות מספר שלם בין1ל-10. אם לא מציינים את השדהmaxRetryCount, ערך ברירת המחדל הוא0, כלומר לא יתבצע ניסיון חוזר של אף משימה.
ACTION: הפעולה,RETRY_TASKאוFAIL_TASK, שרוצים שתתבצע במשימות שנכשלו עם קודי היציאה שצוינו. משימות שנכשלות עם קודי יציאה לא מוגדרים יבצעו את הפעולה השנייה.
EXIT_CODES: רשימה מופרדת בפסיקים של קוד יציאה אחד או יותר שרוצים להגדיר שיפעילו את הפעולה שצוינה. לדוגמה,50001, 50002.אפשר להגדיר כל קוד יציאה באפליקציה או ב-Batch. קודי היציאה מ-
50001עד59999שמורים ל-Batch. מידע נוסף על קודי היציאה השמורים זמין במאמר בנושא פתרון בעיות.
לדוגמה, העבודה הבאה מנסה לבצע מחדש רק משימות שנכשלו בגלל הקדימות של מכונות וירטואליות מסוג Spot.
POST https://batch.googleapis.com/v1/projects/example-project/locations/us-central1/jobs?job_id=example-job
{
"taskGroups": [
{
"taskSpec": {
"runnables": [
{
"script": {
"text": "sleep 30"
}
}
],
"maxRetryCount": 3,
"lifecyclePolicies": [
{
"action": "RETRY_TASK",
"actionCondition": {
"exitCodes": [50001]
}
}
]
}
}
],
"allocationPolicy": {
"instances": [
{
"policy": {
"machineType": "e2-standard-4",
"provisioningModel": "SPOT"
}
}
]
}
}
שינוי התנהגות המשימה על סמך מספר הניסיונות החוזרים
אופציונלית, אחרי שמפעילים ניסיונות חוזרים אוטומטיים למשימה, כמו שמתואר בקטעים הקודמים בדף הזה, אפשר לעדכן את קובצי ההפעלה כדי להשתמש במשתנה הסביבה המוגדר מראש BATCH_TASK_RETRY_ATTEMPT.
המשתנה BATCH_TASK_RETRY_ATTEMPT מתאר את מספר הפעמים שכבר נעשה ניסיון לבצע את המשימה הזו. אפשר להשתמש במשתנה BATCH_TASK_RETRY_ATTEMPT בקבצים הניתנים להרצה אם רוצים שהתנהגות המשימה תשתנה בהתאם למספר הניסיונות החוזרים.
לדוגמה, כשמנסים לבצע מחדש משימה, יכול להיות שתרצו לוודא אילו פקודות כבר בוצעו בהצלחה בניסיון הקודם. מידע נוסף מופיע במאמר בנושא משתני סביבה מוגדרים מראש.
המאמרים הבאים
- אם נתקלתם בבעיות ביצירה או בהפעלה של משימה, תוכלו להיעזר בפתרון בעיות.
- הצגת משרות ומשימות.
- מידע נוסף על אפשרויות ליצירת משרות