集成函數(shù)計(jì)算
云工作流支持通過(guò)工作流流程定義描述語(yǔ)言直接調(diào)用集成阿里云服務(wù)。本文介紹云工作流如何通過(guò)集成函數(shù)計(jì)算來(lái)調(diào)用函數(shù)。
背景信息
云工作流以不同類型的狀態(tài)(State)作為基礎(chǔ),基于狀態(tài)機(jī)模型描述業(yè)務(wù)的流程,結(jié)合用戶設(shè)置的API調(diào)用參數(shù),完成流程(Flow)中每一個(gè)步驟的執(zhí)行,最終完成整個(gè)工作流的執(zhí)行。
在云工作流中成功的加入并調(diào)用指定函數(shù),需遵循編排規(guī)范。更多信息,請(qǐng)參見(jiàn)以下執(zhí)行步驟的示例信息。
步驟一:選擇狀態(tài)類型
在流程中加入一個(gè)Task類型的狀態(tài),然后根據(jù)Task類型的定義編排函數(shù)計(jì)算。
Type: StateMachine
Name: MyWorkflow
SpecVersion: v1
StartAt: 調(diào)用函數(shù)示例
States:
- Name: 調(diào)用函數(shù)示例
Type: Task
TaskMode: RequestComplete
Action: FC:InvokeFunction
Parameters:
resourceArn: xxx
invocationType: xxx
body: xxx
End: true
步驟二:配置調(diào)用參數(shù)
函數(shù)計(jì)算調(diào)用包含標(biāo)識(shí)函數(shù)資源的ARN,函數(shù)調(diào)用方式及函數(shù)調(diào)用參數(shù)三個(gè)主要的參數(shù)。詳細(xì)信息,如下表所示。
按照Spec規(guī)范,參數(shù)的名稱為小寫開(kāi)頭的駝峰格式。
參數(shù)名稱 | 是否必選 | 參數(shù)類型 | 參數(shù)說(shuō)明 |
resourceArn | 是 | String | 函數(shù)資源的ARN,用于唯一標(biāo)識(shí)函數(shù)。 |
invocationType | 是 | Sync|Async | 函數(shù)調(diào)用方式。 |
body | 否 | JSON對(duì)象或String等類型,最終通過(guò)序列化成字節(jié)數(shù)組的方式傳遞給被調(diào)用的函數(shù)。 | 函數(shù)執(zhí)行程序的Event入口參數(shù)。 |
示例代碼如下。
Type: StateMachine
Name: MyWorkflow
SpecVersion: v1
StartAt: 同步調(diào)用函數(shù)示例
States:
- Name: 同步調(diào)用函數(shù)示例
Type: Task
Action: FC:InvokeFunction
TaskMode: RequestComplete
Parameters:
resourceArn: acs:fc:::services/myService1.LATEST/functions/myFunction1
invocationType: Sync
body:
testKey: 函數(shù)event中testKey參數(shù)包含的內(nèi)容
Next: 異步調(diào)用函數(shù)示例
- Name: 異步調(diào)用函數(shù)示例
Type: Task
Action: FC:InvokeFunction
TaskMode: RequestComplete
Parameters:
resourceArn: acs:fc:::services/myService2.LATEST/functions/myFunction2
invocationType: Async
body:
key1: value1
key2: value2
End: true
步驟三:設(shè)置集成模式
Task狀態(tài)支持一種特殊的屬性TaskMode,即集成模式,用于定義當(dāng)前狀態(tài)對(duì)于API調(diào)用的處理行為。針對(duì)云工作流與函數(shù)計(jì)算集成,目前支持以下三種類型的集成模式。
請(qǐng)求響應(yīng)(RequestComplete)
表示函數(shù)調(diào)用正常請(qǐng)求響應(yīng)返回之后即可進(jìn)行下一個(gè)步驟的執(zhí)行。該模式對(duì)函數(shù)的同步調(diào)用、異步調(diào)用和異步任務(wù)調(diào)用均有效。
等待系統(tǒng)回調(diào)(WaitForSystemCallback)
表示函數(shù)調(diào)用的請(qǐng)求完成之后,函數(shù)系統(tǒng)會(huì)發(fā)出系統(tǒng)回調(diào)通知。工作流接收到通知之后才會(huì)進(jìn)行下一個(gè)步驟的執(zhí)行。該模式僅對(duì)函數(shù)的異步調(diào)用和異步任務(wù)調(diào)用有效。
等待用戶自定義回調(diào)(WaitForCustomCallback)
表示函數(shù)調(diào)用請(qǐng)求完成之后,工作流會(huì)繼續(xù)保持等待狀態(tài),直到用戶程序主動(dòng)通過(guò)云工作流提供的回調(diào)通知API發(fā)送通知,云工作流接收到這一回調(diào)通知后,才會(huì)進(jìn)行后續(xù)步驟的執(zhí)行。該模式僅對(duì)函數(shù)的異步調(diào)用和異步任務(wù)調(diào)用有效。
關(guān)于函數(shù)調(diào)用的更多信息,請(qǐng)參見(jiàn)同步調(diào)用、異步調(diào)用和異步任務(wù)。
Type: StateMachine
Name: MyWorkflow
SpecVersion: v1
StartAt: 同步調(diào)用函數(shù)示例
States:
- Name: 同步調(diào)用函數(shù)示例
Type: Task
Action: FC:InvokeFunction
TaskMode: RequestComplete
Parameters:
resourceArn: acs:fc:::services/myService1.LATEST/functions/myFunction1
invocationType: Sync
body:
testKey: 函數(shù)event中testKey參數(shù)包含的內(nèi)容
Next: 異步調(diào)用函數(shù)示例
- Name: 異步調(diào)用函數(shù)示例
Type: Task
Action: FC:InvokeFunction
TaskMode: RequestComplete
Parameters:
resourceArn: acs:fc:::services/myService2.LATEST/functions/myFunction2
invocationType: Async
body:
key1: value1
key2: value2
End: true
用戶需要在body
參數(shù)下,增加一個(gè)自定義參數(shù) callbackToken ,并引用$Context.Current.TaskToken
表達(dá)式。該表達(dá)式為回調(diào)任務(wù)執(zhí)行結(jié)果時(shí),必須使用的Token屬性。
步驟四:構(gòu)造調(diào)用參數(shù)
實(shí)際的流程編排中,需要根據(jù)工作流上下文,以及上一個(gè)流程狀態(tài)的結(jié)果來(lái)構(gòu)造當(dāng)前函數(shù)調(diào)用的參數(shù)。具體操作如下。
可以利用Spec定義的一些保留字常量
$Context
和$Input
來(lái)訪問(wèn)流程中的數(shù)據(jù)。
Type: StateMachine
Name: MyWorkflow
SpecVersion: v1
StartAt: 調(diào)用函數(shù)示例
States:
- Name: 調(diào)用函數(shù)示例
Type: Task
TaskMode: RequestComplete
Action: FC:InvokeFunction
Parameters:
resourceArn: acs:fc:::services/myService1.LATEST/functions/myFunction1
invocationType: Sync
body:
argument1.$: $Input.input.BucketName
argument2.$: $Input.input.TaskId
End: true
步驟五:處理調(diào)用結(jié)果
每一個(gè)狀態(tài)的調(diào)用目的都是為整個(gè)流程服務(wù),在函數(shù)調(diào)用的場(chǎng)景下,當(dāng)我們完成調(diào)用之后,會(huì)返回執(zhí)行結(jié)果。用戶可以使用返回結(jié)果作為流程條件判斷語(yǔ)句,也可以作為下一個(gè)狀態(tài)的輸入。根據(jù)函數(shù)計(jì)算的InvokeFunction - 調(diào)用函數(shù)API定義,函數(shù)返回結(jié)果類型為Byte,對(duì)應(yīng)實(shí)際的數(shù)據(jù)類型。函數(shù)內(nèi)部返回值可以是字符串JsonObject、JsonArray或者各種基礎(chǔ)數(shù)據(jù)類型。流程調(diào)用接收到返回結(jié)果之后,會(huì)統(tǒng)一將結(jié)果封裝成一個(gè)JsonObject,在工作流內(nèi)部封裝的結(jié)構(gòu)如下所示。
{
"Body": "函數(shù)調(diào)用結(jié)果"
}
因此,您可以在工作流的描述中通過(guò)$Output.Body
的JsonPath訪問(wèn)函數(shù)返回的結(jié)果。如果函數(shù)返回值本身是一個(gè)JsonObject類型,可以在工作流中直接調(diào)用內(nèi)建函數(shù)反序列化函數(shù)返回結(jié)果,按照J(rèn)sonObject的操作訪問(wèn)函數(shù)返回結(jié)果中的成員。
Type: StateMachine
Name: MyWorkflow
SpecVersion: v1
Description: ' '
StartAt: 調(diào)用函數(shù)示例1
States:
- Name: 調(diào)用函數(shù)示例1
Type: Task
TaskMode: RequestComplete
Action: FC:InvokeFunction
Parameters:
resourceArn: acs:fc:::services/myService1.LATEST/functions/myFunction1
invocationType: Sync
body:
argument1.$: $Input.Records
argument2.$: $Input.BucketName
Next: 條件判斷
- Type: Choice
Name: 條件判斷
Branches:
- Condition: $Input.ObjectSize >= $Input.Threshold
Next: 調(diào)用函數(shù)示例2
Default: 不做動(dòng)作
- Type: Pass
Name: 不做動(dòng)作
End: true
- Name: 調(diào)用函數(shù)示例2
Type: Task
TaskMode: RequestComplete
Action: FC:InvokeFunction
Parameters:
resourceArn: acs:fc:::services/myService2.LATEST/functions/myFunction2
invocationType: Sync
body:
argument1.$: $Input.BucketName
argument2.$: $Input.TaskId
End: true
常見(jiàn)錯(cuò)誤定義
FC.ResourceThrottled
:您的函數(shù)因?yàn)椴l(fā)度過(guò)高被限流。您所有的函數(shù)由一個(gè)總的并發(fā)度控制。Serverless 工作流執(zhí)行到任務(wù)類型節(jié)點(diǎn)時(shí)會(huì)同步調(diào)用函數(shù)計(jì)算,此數(shù)值與其他調(diào)用方式的并發(fā)度共用。您可以申請(qǐng)調(diào)整該值。FC.ResourceExhausted
:您的函數(shù)因?yàn)橘Y源不足被限流。當(dāng)出現(xiàn)這類錯(cuò)誤時(shí),請(qǐng)聯(lián)系我們。FC.InternalServerError
:函數(shù)計(jì)算出現(xiàn)系統(tǒng)錯(cuò)誤,請(qǐng)重新執(zhí)行流程。FC.AccessDenied
:禁止訪問(wèn),賬號(hào)權(quán)限不足。FC.InvalidArgument
:參數(shù)無(wú)效。FC.EntityTooLarge
:函數(shù)的入?yún)⑻蟆?/p>
注: 更多函數(shù)計(jì)算錯(cuò)誤類型,請(qǐng)參見(jiàn)錯(cuò)誤碼列表。