備援指示指的是:明確定義排程任務在兩種情況下該怎麼收尾——一種是 retry policy(重試策略)已經用盡、重試了規定的次數仍然失敗,另一種是失敗一開始就被判定為結構性問題、根本不該浪費時間重試。它處理的是失敗處理流程裡的最後一步,跟重試策略是先後接續的兩個階段:重試策略決定要不要再試一次,備援指示決定試到最後還是不行時該怎麼辦。沒有備援指示的系統,重試用盡後通常就是直接停止,沒有任何後續動作,這個「直接停止」表面上看起來像流程結束了,實際上是留下一個沒人知道的空白——任務已經放棄,但沒有人被告知。
這個機制會被需要,是因為「重試用盡」跟「任務完成」在系統外部看起來幾乎一樣——排程照常在設定的時間執行,沒有跳出明顯的錯誤視窗,一切表面上顯得正常,只有真正打開日誌才看得出這次其實是重試三次都失敗後自動放棄的。這種沉默的失敗特別危險,因為它不像立即崩潰的錯誤那樣會被立刻發現,而是會持續累積——資料連續好幾天沒更新、報表連續好幾週用的是舊資料,卻沒有任何警訊,直到有人主動去核對才會發現問題已經存在一段時間了。備援指示存在的理由,就是強迫在重試用盡的那一刻,系統必須做出一個看得見的動作,而不是安靜地什麼都不做。
實務上要先做一個判斷,再決定三種收尾方式該用哪一種。判斷是:這個任務的輸出,能不能接受「先給一份不完整或延遲的結果」,還是必須完全正確才有意義。如果可以接受部分結果,收尾方式選「產出標記不完整的部分結果」,例如報表裡缺漏的欄位標成「資料待補」,讓下游使用者知道這份資料不是全的,而不是誤以為完整;如果有備用資料來源可用,收尾方式選「切換備用來源」,例如主要 API 掛掉時改抓快取或次要來源,但要在輸出裡註明這是備用來源產生的,避免品質落差被誤認為正常結果;如果以上都不適用、任務必須完全正確才能用,收尾方式選「直接停止並通知」,把失敗詳情(哪個步驟、什麼錯誤訊息)整理清楚交給人工處理,不要只丟一句「任務失敗」讓人自己去查。三種方式的共同要求是:不管選哪一種,都要有一個明確、人看得到的訊號,證明系統知道自己沒有成功完成任務。
對你來說,備援指示真正的價值在於:把「任務失敗」從一個可能被完全忽略的沉默事件,變成一個一定會被看見的明確狀態。這個差別在資料連續好幾天沒更新卻沒人發現的情境裡格外關鍵——沒有備援指示,你可能要等到主管問起某個數字為什麼跟預期差很多,才回頭發現原來排程任務早就悄悄放棄了;有備援指示,任務放棄的當下就有人被通知,問題在還小的時候就被處理,不會累積成更大的麻煩。要留意的是:備援指示的三種收尾方式裡,「產出部分結果」看起來風險最低、最不會打斷流程,但如果標記不完整的方式做得不夠明顯(例如只在系統日誌裡寫一行,前端完全看不出來),下游使用者仍然可能誤把不完整的資料當成完整的用,這種情況比直接停止還危險,因為錯誤的資料正在被當成正確的資料使用。
Google Cloud 在其官方可靠性工程文件中提到,服務失敗時應該優先考慮「優雅降級」(graceful degradation),也就是在核心功能無法運作時,提供一個功能受限但仍然有用的替代結果,而不是讓整個服務直接失效;文件特別強調,任何降級狀態都必須有清楚的訊號讓維運人員知道系統目前處於非正常狀態,避免降級被誤認為是正常運作而遲遲沒有修復。
優點是把失敗從可能被完全忽略的沉默事件變成保證被看見的明確狀態,讓問題在還小的時候就被處理;缺點是三種收尾方式各有風險——切換備用來源可能帶來品質落差、產出部分結果如果標記不夠明顯反而比直接停止更危險、直接停止並通知則會拖慢流程,該選哪一種取決於任務本身能不能接受不完整或延遲的輸出,沒有一種收尾方式是通用的正確答案。