個別工作任務或甚至工作執行作業都可能因各種原因而失敗。本頁面將說明處理這些失敗情況的最佳做法,主要著重於工作重新啟動和工作檢查點。
使用工作重試
個別工作任務可能會因多種原因而失敗,包括應用程式依附元件、配額,甚至是內部系統事件的問題。這類問題通常是暫時性的,重試後任務就會成功。
根據預設,每項工作最多會自動重試 3 次。這有助於確保工作即使遇到暫時性工作失敗,也能順利完成。您也可以自訂重試次數上限。不過,如果您確實變更預設值,請至少指定一次重試。
規劃工作任務重新啟動
請將工作設為冪等,以免工作重新啟動導致輸出內容損毀或重複。也就是說,無論重複執行次數或執行時間為何,都會針對特定一組輸入內容產生相同行為的邏輯。
將輸出內容寫入與輸入資料不同的位置,讓輸入資料保持不變。如此一來,如果工作再次執行,工作就能從頭重複該程序,並取得相同的結果。
重複使用相同的專屬 ID 或檢查輸出內容是否已存在,以免產生重複的輸出資料。重複資料代表收集層級資料毀損。
使用檢查點
盡可能設定工作檢查點,這樣在任務發生錯誤後重新啟動時,就能接續上次進度,而不用從頭重新開始。這麼做可加快工作速度,並盡量減少不必要的成本。
定期將部分結果和進度指標寫入永久性儲存空間位置,例如 Cloud Storage 或資料庫。工作開始時,請尋找啟動時的部分結果。如果只找到部分結果,請從上次中斷處開始處理。
如果工作不利於檢查點,請考慮將工作拆成較小的部分,並執行更多工作。
檢查點範例 1:計算圓周率
如果您有執行遞迴演算法的工作 (例如計算 Pi 的小數位數),且使用了設為 1 的平行處理功能:
- 每隔 10 分鐘或您允許的任何工作遺失容許值,將進度寫入
pi-progress.txt
Cloud Storage 物件。 - 工作開始時,請查詢
pi-progress.txt
物件,並將值載入為起始位置。將該值做為函式的初始輸入內容。 - 將最終結果寫入 Cloud Storage,做為名為
pi-complete.txt
的物件,以避免透過平行或重複執行作業產生重複內容,或是使用pi-complete-DATE.txt
以完成日期區分。
檢查點示例 2:處理 Cloud SQL 中的 10,000 筆記錄
如果您有在關聯資料庫 (例如 Cloud SQL) 中處理 10,000 筆記錄的工作:
- 使用 SQL 查詢 (例如
SELECT * FROM example_table LIMIT 10000
) 擷取要處理的記錄 - 以 100 筆為單位批次寫出更新的記錄,避免在中斷時遺失重要處理工作。
- 記錄寫入時,請注意哪些記錄已處理。您可以將處理過的布林值資料欄新增至表格,只有在處理作業完成後,才會設為 1。
- 工作開始時,用於擷取待處理項目的查詢應新增 processed = 0 條件。
- 除了重試之外,這項技術還可將工作分割成較小的任務,例如修改查詢,一次選取 100 個記錄:
LIMIT 100 OFFSET $CLOUD_RUN_TASK_INDEX*100
,然後執行 100 個任務來處理所有 10,000 個記錄。CLOUD_RUN_TASK_INDEX
是執行 Cloud Run 工作的容器內建環境變數。
將所有這些部分組合起來,最終查詢可能會像這樣:
SELECT * FROM example_table WHERE processed = 0 LIMIT 100 OFFSET $CLOUD_RUN_TASK_INDEX*100