錯誤和條件式執行
適用於:Azure Data Factory Azure Synapse Analytics
提示
試用 Microsoft Fabric 中的 Data Factory,這是適用於企業的全方位分析解決方案。 Microsoft Fabric 涵蓋從資料移動到資料科學、即時分析、商業智慧和報告的所有項目。 了解如何免費開始新的試用!
條件式路徑
Azure Data Factory 和 Synapse 管線協調流程允許條件式邏輯,可讓使用者根據先前活動的結果採取不同的路徑。 使用不同的路徑可讓使用者建立健全的管線,並將錯誤處理納入 ETL/ELT 邏輯中。 總共允許四個條件式路徑,
名稱 | 說明 |
---|---|
成功時 | (預設通過) 如果目前活動成功,則執行此路徑 |
失敗時 | 如果目前活動失敗,則執行此路徑 |
完成時 | 在目前活動完成之後執行此路徑,無論是否成功 |
跳過時 | 如果活動本身未執行,則執行此路徑 |
您可以在活動之後新增多個分支,但有一個例外:完成時路徑不能與成功時或失敗時路徑共存。 針對每個管線執行,根據活動的執行結果,最多會啟動一個路徑。
錯誤處理
常見的錯誤處理機制
Try Catch 區塊
在此方法中,客戶定義商務邏輯,而且只定義「失敗時」路徑以攔截前一個活動的任何錯誤。 如果「失敗時」路徑成功,此方法會判定管線成功。
Do If Else 區塊
在此方法中,客戶定義商務邏輯,並定義「失敗時」和「成功時」路徑。 即使「失敗時」路徑成功,此方法仍會判定管線失敗。
Do If Skip Else 區塊
在此方法中,客戶定義商務邏輯,並定義「失敗時」路徑和「成功時」路徑,還附加虛擬的「跳過時」活動。 如果「失敗時」路徑成功,此方法會判定管線成功。
摘要表
方法 | 定義 | 活動成功時,整個管線顯示 | 活動失敗時,整個管線顯示 |
---|---|---|---|
Try-Catch | 只有「失敗時」路徑 | 成功 | 成功 |
Do-If-Else | 「失敗時」路徑 +「成功時」路徑 | 成功 | 失敗 |
Do-If-Skip-Else | 「失敗時」路徑 +「成功時」路徑 (結尾加上「虛擬跳過時」) | 成功 | 成功 |
如何判斷管線失敗
不同的錯誤處理機制會導致管線的狀態不同:有些管線失敗,而有些是成功。 我們如下判斷管線成功和失敗:
- 評估所有分葉活動的結果。 如果跳過分葉活動,則改為評估其父活動
- 唯有所有節點都評估為成功時,管線結果才成功
假設「失敗時」活動和「虛擬失敗時」活動成功,
在 Try-Catch 方法中,
- 前一個活動成功時:跳過「失敗時」節點,其父節點成功;整個管線成功
- 前一個活動失敗時:「失敗時」節點起作用;整個管線成功
在 Do-If-Else 方法中,
- 前一個活動成功時:「成功時」節點成功,跳過「失敗時」節點 (其父節點成功);整個管線成功
- 上一個活動失敗時:跳過「成功時」節點,其父節點失敗;整個管線失敗
在 Do-If-Skip-Else 方法中,
- 前一個活動成功時:跳過「虛擬跳過時」節點,其父節點「成功時」成功;跳過另一個節點活動「失敗時」,其父節點成功;整個管線成功
- 前一個活動失敗時:「失敗時」節點成功,「虛擬跳過時」成功;整個管線成功
條件式執行
當我們開發更複雜且彈性的管線時,有時需要將條件式執行引入邏輯:只有在符合特定條件時才執行特定活動。 有很多使用案例,例如:
- 如果先前的複製工作成功,則執行後續活動,例如傳送電子郵件通知
- 如果先前的任何活動失敗,則執行錯誤處理工作
- 如果活動本身或其對應的錯誤處理活動成功,則繼續進行下一個步驟
- 等等。
在這裡,我們會說明一些常見的邏輯,以及如何在 ADF 中實作它們。
單一活動
以下是單一活動之後的一些常見模式。 我們可以使用這些模式作為建置區塊,以建構複雜的工作流程。
錯誤處理
模式是 ADF 中最常見的條件邏輯。 針對「失敗時」路徑定義錯誤處理活動,如果主要活動失敗,則叫用該活動。 它應該納入為需要後援替代方案或記錄的所有任務關鍵步驟的最佳做法。
最大努力步驟
某些步驟 (例如資訊記錄) 較不重要,且其失敗不應該封鎖整個管線。 在這種情況下,我們應該採用最大努力策略:將後續步驟新增至「完成時」路徑,以解除封鎖工作流程。
且
第一個和最常見的案例是條件式「和」:只有在先前的活動成功時,才繼續管線。 例如,您可能有需要先成功,才移至資料處理的下一個階段的多個複製活動。 在 ADF 中,可以輕鬆地達成此行為:為下一個步驟宣告多個相依性。 在圖形上,表示是有多條線條指向下一個活動。 您可以選擇「成功時」路徑,以確保相依性成功,或「完成時」路徑,以允許最大努力執行。
在這裡,只有在兩個 Web 活動都成功時,才會執行後續等候活動。
而這裡,當 ActivitySucceeded 通過且 ActivityFailed 完成時,後續等候活動就會執行。 請注意,使用「成功時」路徑時,ActivitySucceeded 必須成功,而「完成時」路徑上的 ActivityFailed 會以最大努力執行,也就是說,可能會失敗。
Or
第二個常見案例是條件式 "or":如果任何相依性成功或失敗,則執行活動。 在這裡,我們需要使用「完成時」路徑 If 條件活動和運算式語言。
在深入探討程式碼之前,我們需要再了解一件事。 活動執行並完成之後,您可以使用 @activity('ActivityName').Status 參考其狀態。 其為 "Succeeded"_ 或 "Failed"。 我們使用此屬性來建置條件式或邏輯。
共用錯誤處理記錄步驟
在某些情況下,如果任何先前的活動失敗,您可能想要叫用共用錯誤處理或記錄步驟。 您可以像這樣建置管線:
- 平行執行多個活動
- 在 True 分支中,新增 if 條件以包含錯誤處理步驟
- 使用「完成時」路徑,將活動連線到條件活動
- 條件活動讀取的邏輯運算式
@or(equals(activity('ActivityFailed').Status, 'Failed'), equals(activity('ActivitySucceeded').Status, 'Failed'))
- 注意:如果您有兩個以上的相依性活動,則需要串連 or,例如,
@or(or(equals(activity('ActivityFailed').Status, 'Failed'), equals(activity('ActivitySucceeded1').Status, 'Failed')),equals(activity('ActivitySucceeded1').Status, 'Failed'))
如果有任何活動成功,則為綠燈
當您的所有活動都為最大努力時,如果有任何先前的活動成功,您可能會想要繼續進行下一個步驟。 您可以像這樣建置管線:
- 平行執行多個活動
- 在 True 分支中,新增 if 條件以包含後續步驟
- 使用「完成時」路徑,將活動連線到條件活動
- 條件活動讀取的邏輯運算式
@or(equals(activity('ActivityFailed').Status, 'Succeeded'), equals(activity('ActivitySucceeded').Status, 'Succeeded'))
- 注意:圖表看起來與上一個案例完全相同。 唯一的差異是使用的運算式語言
複雜案例
所有活動都需要成功才能繼續
模式是兩者的組合:條件式「和」+ 錯誤處理。 如果所有前述活動都成功,管線會繼續進行後續步驟,否則它會執行共用的錯誤記錄步驟。 您可以像這樣建置管線:
- 平行執行多個活動
- 新增 if 條件。 在 True 分支中新增後續步驟,並在 False 分支中新增錯誤處理程式碼
- 使用「完成時」路徑,將活動連線到條件活動
- 條件活動讀取的邏輯運算式
@and(equals(activity('ActivityFailed').Status, 'Succeeded'), equals(activity('ActivitySucceeded').Status, 'Succeeded'))
常見模式
Try-Catch-Proceed
該模式相當於在程式碼中的 try catch 區塊。 管線中的活動可能會失敗。 當它失敗時,客戶必須執行錯誤處理工作來處理它。 不過,單一活動失敗不應該封鎖管線中的下一個活動。 例如,我嘗試執行複製工作,將檔案移至儲存體。 不過,它可能會在半途失敗。 在此情況下,我想要從儲存體帳戶中刪除部分複製、不可靠的檔案 (我的錯誤處理步驟)。 但之後我還是可以繼續其他活動。
若要設定模式:
- 新增第一個活動
- 將錯誤處理新增至 UponFailure 路徑
- 新增第二個活動,但未連線到第一個活動
- 將來自錯誤處理活動的 UponFailure 和 UponSkip 路徑連線到第二個活動
注意
每個路徑 (UponSuccess、UponFailure 和 UponSkip) 都可以指向任何活動。 多個路徑可以指向相同的活動。 例如,UponSuccess 和 UponSkip 可以指向一個活動,而 UponFailure 指向不同的活動。
只有在第一個活動失敗時,錯誤處理工作才會執行。 不論第一個活動是否成功,下一個活動都會執行。
一般錯誤處理
我們通常會在管線中循序執行多個活動。 如果有任何失敗,我需要執行錯誤處理工作來清除狀態,和/或記錄錯誤。 例如,我在管線中有循序複製活動。 如果其中任一項失敗,我需要執行指令碼工作來記錄管線失敗。
若要設定模式:
- 建置循序資料處理管線
- 將一般錯誤處理步驟新增至管線尾端
- 將來自最後一個活動的 UponFailure 和 UponSkip 路徑連線到錯誤處理活動
最後一個步驟:一般錯誤處理,只會在先前的任何活動失敗時執行。 如果全部成功,則不會執行。
您可以針對錯誤處理新增多個活動。