平行工作流狀態 - AWS Step Functions

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

平行工作流狀態

Parallelstate ("Type": "Parallel") 可用於在狀態機中添加單獨的執行分支。

除了常見狀態欄位以外,Parallel 狀態還引進下列額外欄位。

Branches (必要)

指定要以平行方式執行狀態機器的物件陣列。每個這類狀態機器物件必須具有名為 StartAtStates 的欄位,其意義完全如同狀態機器最上層中的欄位。

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 } } } ] } } }

在這個範例中,LookupAddressLookupPhone 分支會以平行方式執行。以下是視覺化工作流程在 Step Functions 主控台中的外觀。

範例 parallel 工作流程的視覺化圖表。

每個分支必須可獨立自主運作。一個 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] 做為輸入,則 AddSubtract 狀態都會收到該陣列做為輸入。AddSubtract task 的輸出將是數組元素 3 和 2 之間的總和和差異15Parallel狀態的輸出將是一個數組。

[ 5, 1 ]
提示

如果您在狀態機器中使用的「平行」或「對映」狀態傳回陣列陣列,您可以將它們轉換為具有ResultSelector欄位的平面陣列。如需詳細資訊,請參閱扁平化陣列的陣列

錯誤處理

如有任何分支因為未處理的錯誤或經由轉移到 Fail 狀態而失敗,則整個 Parallel 狀態會被視為失敗,而且其所有分支都會停止。如果錯誤不是由Parallel狀態本身處理,Step Functions 會停止執行並出現錯誤。

注意

當 parallel 狀態失敗時,叫用的 Lambda 函數會繼續執行,且不會停止處理工作權杖的活動工作者。

  • 若要停止長時間執行的活動,請使用活動訊號來偵測其分支是否已由 Step Functions 停止,並停止正在處理工作的 Worker。如果狀態失敗,則呼叫 SendTaskHeartbeatSendTaskSuccessSendTaskFailure 會拋出錯誤。請參閱活動訊號錯誤

  • 執行 Lambda 函數無法停止。如果您已實作後援,請使用Wait狀態,以便在 Lambda 函數完成後進行清理工作。