觸發條件指的是:決定一個排程任務什麼時候該真正啟動的判斷邏輯,不只是「幾點幾分」這麼單純。最基礎的觸發條件是固定時間,時間到了任務就跑;但更完整的觸發條件會加入額外的判斷,例如「時間到了,但也要確認前一個步驟的資料是否已經產生」,或「時間到了,但如果今天是假日就跳過」。這跟 retry policy(重試策略)處理的是不同時間點的問題——重試策略處理的是任務已經啟動、執行失敗之後該怎麼辦,觸發條件處理的是任務一開始該不該啟動,是更上游的判斷。一個設計不完整的觸發條件,會讓任務在資料還沒準備好的情況下就啟動,跑出來的結果表面上看起來成功了,實際上處理的是不完整或過期的資料。
這個問題會被需要,是因為時間本身跟「該做這件事的條件是否成立」是兩件經常被混為一談的事。你設定每天早上九點彙整前一天的系統警訊,這個時間點的假設是「前一天的資料在九點前一定已經整理完成」,但如果前一個環節偶爾延遲(例如上游系統維護晚了,資料十點才寫入完成),九點觸發的任務會在資料還沒到齊時就開始跑,產出一份看起來正常、實際上少了幾筆的報告。這種錯誤特別難發現,因為排程確實有跑、確實有產出,不會跳出任何錯誤訊息,只有仔細核對資料筆數才會發現少東西。觸發條件存在的理由,就是把「時間到了」跟「真的可以開始了」這兩個原本被當成同一件事的判斷分開處理。
實務上分兩層設計。第一層是基礎時間設定:決定任務該多久跑一次、在什麼時間點,這是最容易設定的部分。第二層是額外的前置檢查:在正式執行任務前,先確認該處理的資料是否真的存在、格式是否正確、數量是否符合預期範圍——如果檢查沒通過,任務不執行正式流程,而是進入等待或直接通知人工確認,而不是照樣硬跑產出一份基於不完整資料的結果。常見的前置檢查包括:確認前一個排程任務是否已經標記完成、確認要處理的檔案是否存在且非空、確認資料的時間戳記是否落在預期範圍內。這一層的設計成本高於單純設定時間,但正是這一層在防止「任務跑了但資料是錯的」這種最難察覺的失敗類型。
對你來說,觸發條件真正的價值在於:把「任務有沒有跑」跟「任務跑出來的結果對不對」這兩件容易被當成同一回事的問題分開檢視。只設固定時間、沒有前置檢查的排程任務,你能確認的只有「它有沒有在該執行的時間執行」,無法確認「它執行的當下,資料是不是真的準備好了」——這兩件事看起來很接近,實際上是完全不同層次的保證。要留意的是:前置檢查本身也要拿捏合理的嚴格程度,檢查條件設得太嚴格(例如要求資料筆數必須完全等於某個固定數字),反而會讓任務在資料量正常波動時被誤判成「還沒準備好」而卡住不執行;檢查條件設得太寬鬆,又會讓真正有問題的資料矇混過關。合理的做法通常是設定一個範圍而非絕對值,並在不確定時選擇通知人工確認,而不是自己猜測該不該跑。
Apache Airflow 這類工作流排程工具的官方文件裡,把「感應器」(sensor)列為核心元件之一,讓任務不是單純依賴固定時間點觸發,而是可以設定成持續檢查某個外部條件(例如某個檔案是否已經產生、某張資料表是否已經更新)是否成立,條件成立後才真正啟動下游任務;這類設計背後的邏輯,正是承認固定時間跟資料真正就緒之間經常存在落差,需要額外的條件檢查機制去彌補。
優點是能防止「任務跑了但資料是錯的」這種最難察覺的失敗類型,把資料就緒的判斷從假設變成實際檢查;缺點是設計前置檢查需要額外的時間成本,而且檢查條件的嚴格程度不容易一次拿捏準確,設太嚴格會誤判正常波動、設太寬鬆會讓真正的問題矇混過關,通常需要實際運行一段時間後才能校準到合適的範圍。