在Serverless 工作流程的任務步驟中,非同步呼叫Function Compute可以更靈活地適應一些任務情境,例如長時任務、人工審核等,協助您避免限流等錯誤,同時可以簡化流程中的錯誤處理和重試邏輯。本文介紹Serverless 工作流程整合函數非同步呼叫的背景資訊、整合模式和使用樣本等。
前提條件
- 可選:開啟非同步呼叫
當您的函數開啟了有狀態非同步呼叫時,您還可以在任務執行過程中停止函數執行個體,並獲得對整個執行流程更細粒度的可觀測性。
- 授予Function Compute訪問Serverless 工作流程的許可權,確保當函數非同步執行完成後可以正常回調Serverless 工作流程繼續執行後續流程。權限原則如下所示:
{ "Statement": [ { "Effect": "Allow", "Action": [ "fnf:ReportTaskSucceeded", "fnf:ReportTaskFailed" ], "Resource": [ "*" ] } ], "Version": "1" }
關於授權的詳細資料,請參見授予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的阿里雲帳號(主帳號)在單個地區內預設的按量執行個體上限數為300。
當您使用Serverless 工作流程調用函數時,也存在一些其他的函數調用,這些調用會共用相同的配額,因此可能會造成限流等報錯。從而您需要在Serverless 工作流程的流程中定義較複雜的重試策略,但也無法保證流程是否會執行成功。
- 當部分任務的執行時間較長,採用同步調用時,Serverless 工作流程會與Function Compute建立長連結,由於網路波動可能會導致一些非預期錯誤。
- 在某些情境下,無需等待任務執行完成後再執行後續步驟。
- 在流程執行的過程中,如果遇到非預期錯誤,可以忽略該步驟的函數調用,直接執行後續操作。
適用情境
整合模式 | 模式(pattern)參數 | 適用情境 |
請求響應模式(預設模式) | requestResponse 流程樣本如下:
| 長時間執行的任務、無需瞭解任務執行結果。 |
同步模式 | sync 流程樣本如下:
| 長時間執行的任務、可能被限流的任務。 |
回調模式 | waitForCallback 流程樣本如下:
| 任務在執行到某些情況下,可以繼續後續的步驟,例如人工審核。 |
任務服務參數
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)。在收到回調請求並處理完成後,流程將進入下一步驟。回調由您發起,此時函數執行流程可能已經執行完成,也可能還在執行。
推薦使用樣本
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