工作重試和檢查點的最佳做法

個別工作任務或甚至工作執行作業可能會因各種原因而失敗。本頁面提供處理這些失敗的最佳做法,主要著重於工作重新啟動和工作檢查點。

使用工作重試

個別工作任務可能因多種原因而失敗,包括應用程式依附元件、配額,甚至是內部系統事件的問題。這類問題通常只是暫時性,重試後即可成功執行工作。

根據預設,每項工作最多會自動重試 3 次。即使遇到暫時性任務失敗,也能確保工作順利完成。您也可以自訂重試次數上限。不過,如果您變更預設值,則應至少指定一次重試。

規劃工作任務重新啟動

將工作設為冪等,這樣重新啟動工作時,就不會產生損毀或重複的輸出內容。也就是說,編寫可重複的邏輯,無論重複多少次或何時執行,對於一組指定的輸入內容,其行為都相同。

將輸出內容寫入與輸入資料不同的位置,讓輸入資料保持不變。這樣一來,如果工作再次執行,就能從頭重複執行程序,並取得相同結果。

請重複使用相同的專屬 ID,或檢查輸出內容是否已存在,避免輸出重複資料。重複資料代表集合層級資料毀損。

使用查核點

設計工作時,請盡可能使用檢查點。如果工作失敗並重新啟動,查核點功能可讓工作從上次儲存的狀態繼續執行,不必從頭開始,進而縮短執行時間,並盡可能減少不必要的費用。

如要導入檢查點,請按照下列步驟操作:

  • 儲存進度:定期將部分結果和進度標記寫入永久儲存空間,例如 Cloud Storage 或資料庫。

  • 啟動時檢查:設定工作,在啟動時尋找並從這些部分結果繼續執行。

  • 啟用重試:設定多次重試,防止工作因先占事件而中斷。

如果工作無法設定檢查點,請將工作負載分成較小的區塊,並改為執行較多工作。

檢查點範例 1:計算圓周率

如果工作執行遞迴演算法 (例如計算圓周率至多個小數位數),且平行處理設為 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 筆為單位批次寫入更新記錄,避免因中斷而遺失大量處理工作。
  • 寫入記錄時,請留意哪些記錄已處理完畢。您可以在資料表中新增布林值資料欄 processed,並在確認處理後將其設為 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

檢查點範例 3:應用程式層級檢查點和工作重試

啟用 GPU 的工作可設定最長 12 小時的任務逾時時間,但這只是上限,不保證執行過程不會中斷。基礎架構維護作業會定期重新啟動這些任務,因此執行數小時的任務預計至少會重新啟動一次。如要處理這種情況,同時避免進度遺失,請使用應用程式層級檢查點,並搭配工作重試 (--max-retries)。

工作重新啟動時,會在全新的容器中啟動 (完全重設記憶體和 VRAM,防止記憶體流失)。指令碼啟動時,會自動偵測 Cloud Storage 掛接目錄中的現有檢查點,並從最後一個步驟自動繼續執行。

詳情請參閱這個範例和「設計彈性的長時間執行 GPU 工作」教學課程。

後續步驟