本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
平行工作流狀態
Parallel
state ("Type": "Parallel"
) 可用於在狀態機中添加單獨的執行分支。
除了常見狀態欄位以外,Parallel
狀態還引進下列額外欄位。
-
Branches
(必要) -
指定要以平行方式執行狀態機器的物件陣列。每個這類狀態機器物件必須具有名為
StartAt
和States
的欄位,其意義完全如同狀態機器最上層中的欄位。 -
ResultPath
(選用) -
指定要將分支的輸出放置於何處 (在輸入中)。輸入會先依據
OutputPath
欄位 (如果有的話) 所指定篩選,而後做為狀態的輸出。如需詳細資訊,請參閱輸入和輸出處理。 -
ResultSelector
(選用) -
傳遞鍵值對的集合,其中值是靜態的或從結果中選擇的。如需詳細資訊,請參閱ResultSelector。
-
Retry
(選用) -
稱為 Retrier 的物件陣列,這類物件可定義狀態發生執行時間錯誤時的重試政策。如需詳細資訊,請參閱使用「重試」和使用 Catch 的狀態機示例。
-
Catch
(選用) -
稱為 Catcher 的物件陣列,這類物件可定義在狀態發生執行時間錯誤以及其重試政策已耗盡或未定義時執行的備用狀態。如需詳細資訊,請參閱備用狀態。
Parallel
狀態會導 AWS Step Functions 致執行每個分支,從該分支StartAt
字段中命名的狀態開始,盡可能同時執行,並等到所有分支終止(達到終端狀態),然後再處理該Parallel
狀態的Next
字段。
Parallel 狀態範例
{ "Comment": "Parallel Example.", "StartAt": "LookupCustomerInfo", "States": { "LookupCustomerInfo": { "Type": "Parallel", "End": true, "Branches": [ { "StartAt": "LookupAddress", "States": { "LookupAddress": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:AddressFinder", "End": true } } }, { "StartAt": "LookupPhone", "States": { "LookupPhone": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:PhoneFinder", "End": true } } } ] } } }
在這個範例中,LookupAddress
和 LookupPhone
分支會以平行方式執行。以下是視覺化工作流程在 Step Functions 主控台中的外觀。
每個分支必須可獨立自主運作。一個 Parallel
狀態分支中的狀態不得有以該分支外部欄位為目標的 Next
欄位,而且分支外部的任何其他狀態也不能轉移到該分支。
Parallel 狀態輸入和輸出處理
Parallel
狀態會為每個分支提供一份自有的輸入資料 (可由 InputPath
欄位隨時修改)。它會產生陣列形式的輸出,其中包含分支輸出的每個分支都有一個元素。所有元素不需要都是相同的類型。按照一般方式使用 ResultPath
欄位,即可將輸出陣列插入輸入資料中 (以及整個當作 Parallel
狀態的輸出傳送) (請參閱輸入和輸出處理)。
{ "Comment": "Parallel Example.", "StartAt": "FunWithMath", "States": { "FunWithMath": { "Type": "Parallel", "End": true, "Branches": [ { "StartAt": "Add", "States": { "Add": { "Type": "Task", "Resource": "arn:aws:states:us-east-1:123456789012:activity:Add", "End": true } } }, { "StartAt": "Subtract", "States": { "Subtract": { "Type": "Task", "Resource": "arn:aws:states:us-east-1:123456789012:activity:Subtract", "End": true } } } ] } } }
如果 FunWithMath
狀態取得陣列 [3, 2]
做為輸入,則 Add
和 Subtract
狀態都會收到該陣列做為輸入。Add
和 Subtract
task 的輸出將是數組元素 3 和 2 之間的總和和差異1
,5
而Parallel
狀態的輸出將是一個數組。
[ 5, 1 ]
提示
如果您在狀態機器中使用的「平行」或「對映」狀態傳回陣列陣列,您可以將它們轉換為具有ResultSelector欄位的平面陣列。如需詳細資訊,請參閱扁平化陣列的陣列。
錯誤處理
如有任何分支因為未處理的錯誤或經由轉移到 Fail
狀態而失敗,則整個 Parallel
狀態會被視為失敗,而且其所有分支都會停止。如果錯誤不是由Parallel
狀態本身處理,Step Functions 會停止執行並出現錯誤。
注意
當 parallel 狀態失敗時,叫用的 Lambda 函數會繼續執行,且不會停止處理工作權杖的活動工作者。
-
若要停止長時間執行的活動,請使用活動訊號來偵測其分支是否已由 Step Functions 停止,並停止正在處理工作的 Worker。如果狀態失敗,則呼叫
SendTaskHeartbeat
、SendTaskSuccess
或SendTaskFailure
會拋出錯誤。請參閱活動訊號錯誤。 -
執行 Lambda 函數無法停止。如果您已實作後援,請使用
Wait
狀態,以便在 Lambda 函數完成後進行清理工作。