在Serverless 工作流程的任務步驟中,非同步呼叫Function Compute可以更靈活地適應一些任務情境,例如長時任務、人工審核等,協助您避免限流等錯誤,同時可以簡化流程中的錯誤處理和重試邏輯。本文介紹Serverless 工作流程整合函數非同步呼叫的背景資訊、整合模式和使用樣本等。
前提條件
您已完成以下操作:
可選:開啟非同步呼叫
當您的函數開啟了有狀態非同步呼叫時,您還可以在任務執行過程中停止函數執行個體,並獲得對整個執行流程更細粒度的可觀測性。
授予Function Compute訪問Serverless 工作流程的許可權,確保當函數非同步執行完成後可以正常回調Serverless 工作流程繼續執行後續流程。權限原則如下所示:
{ "Statement": [ { "Effect": "Allow", "Action": [ "fnf:ReportTaskSucceeded", "fnf:ReportTaskFailed" ], "Resource": [ "*" ] } ], "Version": "1" }關於授權的詳細資料,請參見授予Function Compute訪問其他雲端服務的許可權。
背景資訊
預設情況下,Serverless 工作流程編排Function Compute任務是採用同步調用實現的任務流程,即Serverless 工作流程調用Function Compute時會等待函數執行完成後同步獲得返回的輸出,才可以進入到下一個調用的任務。流程定義如下:
version: v1
type: flow
steps:
- type: task
name: mytask
resourceArn: acs:fc:{region}:{account}:services/{serviceName}.{qualifier}/functions/{functionName}預設情況下,採用同步調用Function Compute時可能會存在以下問題:
由於Function Compute存在資源調用限制,即Function Compute的阿里雲帳號(主帳號)在單個地區內預設的按量執行個體上限數為300。
當您使用Serverless 工作流程調用函數時,也存在一些其他的函數調用,這些調用會共用相同的配額,因此可能會造成限流等報錯。從而您需要在Serverless 工作流程的流程中定義較複雜的重試策略,但也無法保證流程是否會執行成功。
當部分任務的執行時間較長,採用同步調用時,Serverless 工作流程會與Function Compute建立長連結,由於網路波動可能會導致一些非預期錯誤。
Serverless 工作流程支援Function Compute的非同步呼叫與整合模式的結合,協助您解決以上問題,同時也可以滿足以下需求:
在某些情境下,無需等待任務執行完成後再執行後續步驟。
在流程執行的過程中,如果遇到非預期錯誤,可以忽略該步驟的函數調用,直接執行後續操作。
適用情境
任務步驟對Function Compute非同步呼叫功能的整合有請求響應(requestResponse)模式、同步(sync)模式和回調(waitForCallback)模式,分別適用於不同情境。
整合模式 | 模式(pattern)參數 | 適用情境 |
請求響應模式(預設模式) |
流程樣本如下: | 長時間執行的任務、無需瞭解任務執行結果。 |
同步模式 |
流程樣本如下: | 長時間執行的任務、可能被限流的任務。 |
回調模式 |
流程樣本如下: | 任務在執行到某些情況下,可以繼續後續的步驟,例如人工審核。 |
任務服務參數
下文樣本中,Serverless 工作流程使用Function Compute作為任務節點,通過resourceArn指定目標服務為Function Compute,並通過serviceParams欄位指定調用Function Compute的特殊參數。serviceParams支援以下參數資訊:
InvocationType:表示Function Compute中函數的調用方式。取值為Sync(同步調用)或Async(非同步呼叫)。可選:
StatefulAsyncInvocationID:表示有狀態非同步執行的ID。該參數可以協助您在Function Compute控制台內搜尋目標任務的名稱。說明當您的參數
InvocationType設定為Async時,表示Serverless 工作流程中調用的函數的非同步呼叫類型為有狀態。該ID需在函數範圍內唯一。
非同步呼叫函數的整合模式
請求響應模式
當流程執行到該步驟時,會非同步呼叫函數,然後開始函數的執行,同時流程會直接進入後續步驟的執行,不會等待回調或任務執行完成。
version: v1
type: flow
steps:
- type: task
name: mytask
resourceArn: acs:fc:{region}:{account}:services/{serviceName}.{qualifier}/functions/{functionName}
pattern: requestResponse # Async invocation with sync pattern
serviceParams:
InvocationType: Async該樣本展示了當mytask步驟執行時會觸發函數執行的流程。觸發成功後,將進入下一步驟,函數執行流程可能仍然正在執行。
同步模式
當流程執行到該步驟時,會非同步呼叫函數,然後開始函數的執行,然後流程會進入等待狀態。當函數執行完成後,Serverless 工作流程的流程會獲得通知然後開始下一步驟的執行。
version: v1
type: flow
steps:
- type: task
name: mytask
resourceArn: acs:fc:{region}:{account}:services/{serviceName}.{qualifier}/functions/{functionName}
pattern: sync # Async invocation with sync pattern
serviceParams:
InvocationType: Async該樣本展示了當該步驟執行時會觸發一個Serverless 工作流程流程。觸發成功後將等待該流程的執行結果,執行完成後將進入下一步驟。當mytask步驟執行時會觸發函數執行的流程。觸發成功後,將等待該流程的執行結果,執行完成後才進入下一步驟。
同步整合模式的整體行為與同步調用函數行為無差異,僅在調用函數時函數的調用方式中有區別。
等待回調模式
當流程執行到該步驟時,會非同步呼叫函數,然後開始函數的執行並傳入任務令牌,之後流程會進入等待狀態。無論函數執行是否完成,直到您手動通過任務令牌通知流程執行結果後才會繼續執行下一個步驟。
version: v1
type: flow
steps:
- type: task
name: mytask
resourceArn: acs:fc:{region}:{account}:services/{serviceName}.{qualifier}/functions/{functionName}
pattern: waitForCallback # Async invocation with sync pattern
serviceParams:
InvocationType: Async該樣本展示了當mytask步驟執行時會觸發函數執行的流程。觸發成功後,將暫停流程執行,等待回調(通過ReportTaskSucceed或ReportTaskFailed)。在收到回調請求並處理完成後,流程將進入下一步驟。回調由您發起,此時函數執行流程可能已經執行完成,也可能還在執行。
推薦使用樣本
Serverless 工作流程非同步呼叫Function Compute功能配合有狀態的非同步呼叫可以最大限度的支援任務類情境。當您開啟有狀態非同步呼叫功能並且採用非同步呼叫的方式時,可以在調用過程及結束後查看函數執行情況,具有更強的任務執行可觀測能力;也可以操作停止函數執行,使流程具有更強的操作能力。Serverless 工作流程的流程定義語言如下所示:
version: v1
type: flow
steps:
- type: task
name: mytask
resourceArn: acs:fc:::services/{serviceName}.{qualifier}/functions/{functionName}
pattern: sync # Async invocation with sync pattern
inputMappings:
- target: id
source: $context.execution.name
serviceParams:
InvocationType: Async
StatefulAsyncInvocationID: $.id