自動重試工作

本頁說明如何在全部或部分工作失敗後,自動重試工作。

如果 Batch 工作中至少有一項工作失敗,該工作就會失敗,而這可能有多種原因。根據預設,工作中的每項工作只會執行一次;如果工作失敗,系統不會重試。不過,如果工作失敗的原因很簡單,只要重試工作就能解決問題。在這些情況下,將工作設定為自動重試工作,可大幅減少疑難排解的摩擦,並縮短工作整體執行時間。

自動重試功能非常適合鬆耦合 (獨立) 工作,有助於解決各種問題。舉例來說,自動重試工作可解決下列時效性問題:

建立工作時,您可以為每個工作設定自動重試次數。具體來說,您可以針對每項工作使用下列任一設定選項:

  • 根據預設,每個工作失敗時都不會重試。
  • 重試所有失敗的工作:您可以設定自動重試失敗工作的次數上限。您可以指定 0 (預設值) 到 10 次重試。
  • 針對部分失敗情況重試工作: 您可以針對特定失敗情況,設定不同的工作動作,例如自動重試或失敗但不重試。對於所有未指定的失敗,系統會採取相反的動作。 您可以透過應用程式或 Batch 定義的結束代碼,識別各項特定失敗。

事前準備

  1. 如果您從未使用過 Batch,請參閱「開始使用 Batch」,並完成專案和使用者的必要條件,啟用 Batch。
  2. 如要取得建立作業所需的權限,請要求管理員授予下列 IAM 角色:

    如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。

    您或許還可透過自訂角色或其他預先定義的角色取得必要權限。

重試所有失敗的工作

您可以使用 gcloud CLI 或 Batch API,為工作失敗的作業定義自動重試次數上限 (maxRetryCount 欄位)

gcloud

  1. 建立 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 改成每個工作的重試次數上限。如要讓工作重試失敗的工作,這個值必須設為介於 110 之間的整數。如未指定 maxRetryCount 欄位,預設值為 0,表示不重試任何工作。

  2. 如要建立及執行作業,請使用 gcloud batch jobs submit 指令

    gcloud batch jobs submit JOB_NAME \
      --location LOCATION \
      --config JSON_CONFIGURATION_FILE
    

    更改下列內容:

    • JOB_NAME:作業名稱。

    • LOCATION:工作地點

    • JSON_CONFIGURATION_FILE:JSON 檔案的路徑,內含作業的設定詳細資料。

API

jobs.create 方法發出 POST 要求,並指定 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:專案的專案 ID

  • LOCATION:工作地點

  • JOB_NAME:作業名稱。

  • MAX_RETRY_COUNT:每個工作的重試次數上限。如要讓工作重試失敗的工作,這個值必須設為介於 110 之間的整數。如未指定 maxRetryCount 欄位,預設值為 0,表示不重試任何工作。

針對部分失敗情況重試工作

您可以透過生命週期政策 (lifecyclePolicies[] 欄位),定義工作處理不同工作失敗情況的方式。

生命週期政策包含動作 (action 欄位)動作條件 (actionCondition 欄位)結束代碼 (exitCodes[] 欄位)。 只要發生動作條件 (特定結束代碼),就會執行指定動作。您可以指定下列其中一項動作:

  • RETRY_TASK:重試因 exitCodes[] 欄位中指定的結束代碼而失敗的工作。如果工作失敗,且結束代碼未指定,系統就不會重試。
  • FAIL_TASK:請勿重試因 exitCodes[] 欄位中指定的結束代碼而失敗的工作。如果工作失敗,且結束代碼未指定,系統會重試。

值得注意的是,如果工作失敗且未指定結束代碼,則會採取相反的動作,也就是重試部分結束代碼,並讓部分結束代碼失敗。因此,如要讓生命週期政策正常運作,您也需要定義自動重試次數上限 (maxRetryCount 欄位),允許工作自動重試失敗的工作至少一次。

每個結束代碼都代表特定失敗,由應用程式或 Batch 定義。結束碼 50001 到 59999 為保留碼,由 Batch 定義。如要進一步瞭解保留的結束代碼,請參閱「疑難排解」一節。

您可以使用 gcloud CLI 或 Batch API,指定工作在特定失敗後重試或失敗。

gcloud

  1. 建立 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:每個工作的重試次數上限。如要讓工作重試失敗的工作,這個值必須設為介於 110 之間的整數。如未指定 maxRetryCount 欄位,預設值為 0,表示不重試任何工作。

    • ACTION:您希望對失敗工作執行的動作,可以是 RETRY_TASKFAIL_TASK,這些工作會以指定的結束代碼失敗。如果工作失敗,且未指定結束代碼,則會採取其他動作。

    • EXIT_CODES:以逗號分隔的一或多個結束代碼清單,用來觸發指定動作,例如 50001, 50002

      每個結束代碼都可以由應用程式或 Batch 定義。Batch 保留 5000159999 的結束代碼。如要進一步瞭解保留的結束代碼,請參閱「疑難排解」一節。

    舉例來說,下列工作只會重試因先占 Spot VM 而失敗的工作。

    {
      "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"
            }
          }
        ]
      }
    }
    
  2. 如要建立及執行作業,請使用 gcloud batch jobs submit 指令

    gcloud batch jobs submit JOB_NAME \
      --location LOCATION \
      --config JSON_CONFIGURATION_FILE
    

    更改下列內容:

    • JOB_NAME:作業名稱。

    • LOCATION:工作地點

    • JSON_CONFIGURATION_FILE:JSON 檔案的路徑,內含作業的設定詳細資料。

API

jobs.create 方法發出 POST 要求,指定 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:專案的專案 ID

  • LOCATION:工作地點

  • JOB_NAME:作業名稱。

  • MAX_RETRY_COUNT:每個工作的重試次數上限。如要讓工作重試失敗的工作,這個值必須設為介於 110 之間的整數。如未指定 maxRetryCount 欄位,預設值為 0,表示不重試任何工作。

  • ACTION:您希望對失敗工作執行的動作,可以是 RETRY_TASKFAIL_TASK,這些工作會以指定的結束代碼失敗。如果工作失敗,且未指定結束代碼,則會採取其他動作。

  • EXIT_CODES:以逗號分隔的一或多個結束代碼清單,用來觸發指定動作,例如 50001, 50002

    每個結束代碼都可以由應用程式或 Batch 定義。Batch 保留 5000159999 的結束代碼。如要進一步瞭解保留的結束代碼,請參閱「疑難排解」一節。

舉例來說,下列工作只會重試因先占 Spot VM 而失敗的工作。

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 變數。舉例來說,重試工作時,您可能想確認先前嘗試中已成功執行的指令。詳情請參閱「預先定義的環境變數」。

後續步驟