集成Serverless 工作流功能讓您可以方便地在一個流程中執行另一個流程,本文介紹了集成Serverless 工作流的使用場景、集成模式、對象說明和子流程的輸入輸出規則。
使用場景
在以下場景中可以考慮使用Serverless 工作流集成:
- 降低流程的復雜度,將一個流程分解為多個流程。
- 讓流程更容易被復用。您可以將通用的一些步驟放在一個流程中,被其他多個流程復用。
- 突破當前單流程的某些限制,例如當前單個流程最多event個數限制(默認5000)和最長執行時間限制(最長1年)。
- 對流程中的一些控制步驟做錯誤處理。例如可以將并行步驟做成子流程,在主流程中對子流程執行錯誤做錯誤處理。
集成模式
Serverless 工作流集成支持三種模式,分別是請求響應(requestResponse)模式、同步(sync)模式和等待回調(waitForCallback)模式。
- 請求響應(requestResponse)模式該模式下,主流程將在啟動子流程成功后立刻開始執行下一步驟。流程定義如下。
version: v1 type: flow steps: - type: task name: fnfInvoke resourceArn: acs:fnf:::flow/subflow_demo_child pattern: requestResponse # 可省略,默認。 inputMappings: # 如無inputMappings,將按默認映射規則將主流程參數作為子流程的Input。 - target: childName # 用于在service中設定發起的子流程的執行名稱。 source: $input.childName serviceParams: # 集成Serverless工作流的服務參數,該參數可省略。如省略本參數,我們將使用隨機字符串作為本次執行的名稱,使用InputMappings對應的參數作為子流程的輸入。 Input: $ # 用映射后的input作為啟動子流程的輸入參數。 ExecutionName: $.childName # 如果在serviceParams中使用變量, 請確保該變量存在于inputMappings中。
- 同步(sync)模式
該模式下,主流程將啟動一個子流程并等待子流程執行完成后再進入下一步驟。流程定義如下。
version: v1 type: flow steps: - type: parallel name: parallelTask branches: - steps: # 本步驟展示使用sync模式集成Serverless工作流,使用inputMappings作為子流程的輸入,并通過主流程的輸入來動態指定子流程的執行名稱。 - type: task name: fnfSync resourceArn: acs:fnf:::flow/subflow_demo_child pattern: sync inputMappings: # 如無inputMappings,將按默認映射規則將主流程參數作為子流程的Input。 - target: childSyncName # 發起的子流程的執行名稱。如您需指定子流程的執行名稱,請按本示例所示對期望的執行名稱進行inputMapping,并在serviceParams中使用。 source: $input.childSyncName。 serviceParams: # 集成Serverless工作流的服務參數。 Input: $ # 用映射后的inputMappings作為啟動子流程的輸入參數. 除非您很明確使用其他方式指定Input時的行為及語法,否則建議您使用我們提供的此種方式。 ExecutionName: $.childSyncName # 如果在serviceParams中使用變量, 請確保該變量存在于inputMappings中。
- 等待回調(waitForCallback)模式
該模式下,主流程將啟動一個子流程并進入暫停狀態,直到收到回調通知。流程定義如下。
version: v1 type: flow steps: - steps: # 本步驟展示使用waitForCallback模式集成Serverless工作流,使用inputMappings作為子流程的輸入,并通過主流程的輸入來動態指定子流程的執行名稱。 - type: task name: fnfWaitForCallback resourceArn: acs:fnf:::flow/subflow_demo_child pattern: waitForCallback inputMappings: # 如無inputMappings,將按默認映射規則將主流程參數作為子流程的Input。 - target: task_token # 為確保子流程中可以使用回調,請自定義名稱對task_token進行顯示映射。 source: $context.task.token # 從context對象中獲取表示該任務的令牌(task token)。 - target: childCallbackName source: $input.childCallbackName serviceParams: # 集成Serverless工作流的服務參數。 Input: $ # 用映射后的inputMappings作為啟動子流程的輸入參數。 ExecutionName: $.childCallbackName # 如果在serviceParams中使用變量, 請確保該變量存在于inputMappings中。
上下文對象說明
在子流程集成模式中,您可以將$context.execution.name
及$context.flow.name
變量傳遞給子流程,用于在子流程中識別啟動它的父流程。在waitForCallback
模式下,$context.task.token
將被使用,用來向子流程傳遞父流程的運行標識符來實現回調。
子流程的輸入輸出規則
- 請求響應模式
子流程的輸入來源于任務的輸入,您可以在子流程中通過
$Input
來獲取該輸入。請求響應模式子流程的啟動信息(
StartExecution
API的響應)將會被作為輸出,而子流程自身輸出將被主流程忽略。在啟動子流程后,我們默認提供了$local.ExecutionName
、$local.FlowName
、$local.RequestId
三個子流程啟動信息。如果您需要對其進行額外處理,可在主流程對應步驟中使用outputMappings
進行映射。- type: task pattern: requestResponse ... outputMappings: # requestResponse模式可獲取參數:$local.ExecutionName, $local.FlowName, $local.RequestId。 - target: subflow_children_request_id source: $local.RequestId # 發起子流程的requestID。 - target: subflow_children_exec_name source: $local.ExecutionName # 發起的子流程的執行名稱。 - target: subflow_children_flow_name source: $local.FlowName # 發起的子流程的流程名稱。
- 同步模式
同步模式中,子流程的輸入來源于任務的輸入,您可以在子流程中通過
$Input
來獲取該輸入。子流程的輸出(
DescribeExecution
API響應中的Output
)將被傳遞回主流程作為主流程該步驟的輸出,您可以在主流程的后續步驟中使用該輸出。如果您需要對子流程的輸出進行額外處理,可以使用outputMappings
對輸出進行映射。 - 等待回調模式
等待回調模式中,子流程的輸入來源于任務的輸入,您可以在子流程中通過
$Input
來獲取該輸入。回調的輸出數據將作為主流程該步驟的輸出。在
ReportTaskSucceeded
接口中,傳入的Output
參數對應的值為主流程該步驟的輸出。在ReportTaskFailed
接口中,傳入的Error及Cause參數及對應的值將作為主流程該步驟的輸出。如果您需要對子流程的輸出進行額外處理,可以使用outputMappings
對輸出進行映射。