云工作流通過使用Task類型的狀態(tài)來調用各種服務,您可以使用三種服務集成模式來控制這些服務調用狀態(tài)流轉。本文介紹請求響應、等待系統(tǒng)回調和等待用戶自定義回調三種集成模式的詳細信息。
注意事項
您可以使用請求響應(RequestComplete)、等待系統(tǒng)回調(WaitForSystemCallback)和等待用戶自定義回調(WaitForCustomCallback)這三種集成模式來集成服務,但不是所有被調用的服務都支持這三種服務集成模式。關于不同服務對三種集成模式的支持情況,請參見集成模式。
請求響應(RequestComplete)
當您在調用任務(Task)狀態(tài)的服務時,默認集成模式為請求響應模式。當您向服務發(fā)出請求時,系統(tǒng)會等待該服務返回響應后再繼續(xù)執(zhí)行后續(xù)的任務。
以下示例展示如何通過請求響應(RequestComplete)調用一個函數(shù)計算的函數(shù)。執(zhí)行這個工作流會調用指定的函數(shù),并等待函數(shù)處理的結果。由于是同步調用,狀態(tài)機會在調用結束后接收到函數(shù)返回的結果。
Type: StateMachine
Name: myWorkFlow
SpecVersion: v1
StartAt: InvokeFunction
States:
- Type: Task
Name: 調用函數(shù)示例
Action: FC:InvokeFunction
TaskMode: RequestComplete
Parameters:
resourceArn: acs:fc:{regionId}:{accountId}:functions/dataji/LATEST
invocationType: Sync
body: xxxx
End: true
等待系統(tǒng)回調(WaitForSystemCallback)
對于一些任務類的集成服務,以及函數(shù)計算異步調用,通過指定等待系統(tǒng)回調(WaitForSystemCallback)任務模式,可以等待任務執(zhí)行完成后再進入下一個狀態(tài)。
以下示例展示如何通過等待系統(tǒng)回調(WaitForSystemCallback)調用一個函數(shù)計算的函數(shù)。
Type: StateMachine
Name: myWorkFlow
SpecVersion: v1
StartAt: InvokeFunction
States:
- Type: Task
Name: 調用函數(shù)示例
Action: FC:InvokeFunction
TaskMode: WaitForSystemCallback
Parameters:
resourceArn: acs:fc:{regionId}:{accountId}:functions/dataji/LATEST
invocationType: Async
body: xxxx
End: true
等待系統(tǒng)回調(WaitForSystemCallback)表示工作流會等待任務完成后才進入下一個狀態(tài)。
如果使用等待系統(tǒng)回調(WaitForSystemCallback)服務集成模式的任務中止流程,云工作流將無法取消該任務,集成服務可能會收取您預期外的費用,因此,需要您自己取消集成任務。僅在以下三種情況下,云工作流可以中止任務。
流程執(zhí)行已停止。
并行(Parallel)狀態(tài)的另一個分支因為被捕獲的錯誤而失敗。
迭代(Map)狀態(tài)的迭代失敗,錯誤未被捕獲。
流程引擎將盡最大努力取消任務,例如,當前流程采用等待系統(tǒng)回調(WaitForSystemCallback)任務模式,調用包含了子流程或函數(shù)計算的異步任務時,調用云工作流的StopExecution - 停止一個正在執(zhí)行的流程API停止當前流程時,云工作流會停止包含在流程中的子流程, 然后停止包含在流程中的異步任務相關函數(shù)執(zhí)行。但是,流程引擎可能無法取消任務,其原因包括但不限于以下幾項。
您的執(zhí)行角色缺乏進行相應API的調用權限。
發(fā)生了臨時服務中斷。
關于支持等待系統(tǒng)回調(WaitForSystemCallback)任務集成模式的阿里云產品列表,請參見支持普通集成的云服務列表。
等待用戶自定義回調(WaitForCustomCallback)
等待用戶自定義回調(WaitForCustomCallback)模式又稱為攜帶任務令牌的回調,提供一種暫停工作流,并根據(jù)集成服務內部自定義邏輯控制工作流執(zhí)行的方式。例如,在流程執(zhí)行中需要等待用戶審批場景,通過集成調用發(fā)起外部系統(tǒng)的審批流程,直至審批流程完成,回調工作流并返回審批結果,工作流再繼續(xù)執(zhí)行后續(xù)的流程步驟。一旦發(fā)起WaitForCustomCallback類型的集成調用,當前任務的執(zhí)行將自動暫停,直到集成服務通過調用ReportTaskSucceeded - 匯報指定的任務執(zhí)行成功或ReportTaskFailed - 匯報指定的任務執(zhí)行失敗接口使得流程繼續(xù)執(zhí)行。
Type: StateMachine
Name: myWorkFlow
SpecVersion: v1
StartAt: InvokeFunction
States:
- Type: Task
Name: 調用函數(shù)示例
Action: FC:InvokeFunction
TaskMode: WaitForCustomCallback
Parameters:
resourceArn: acs:fc:{regionId}:{accountId}:functions/dataji/LATEST
invocationType: Sync
body: xxxx
End: true
用戶自定義回調的工作原理如下圖所示。相比較輪詢,使用回調有效地降低了延遲、減少了輪詢對服務器造成的不必要壓力。此外,回調功能配合隊列可以實現(xiàn)對非函數(shù)計算任務的編排,擴展云工作流的編排范圍到任意類型的計算資源。
WaitForCustomCallback模式集成流程示例
云工作流與外部微服務集成
本小節(jié)以云工作流集成外部微服務執(zhí)行信用檢查為例進行介紹。云工作流發(fā)布一條消息至輕量消息隊列(原 MNS),消息中包含任務令牌Token。外部微服務與輕量消息隊列(原 MNS)集成,從隊列中獲取消息,然后返回結果和原始任務令牌。接下來云工作流繼續(xù)執(zhí)行下面的流程,具體流程信息見下圖。
示例如下。
Type: StateMachine
Name: myWorkFlow
SpecVersion: v1
StartAt: InvokeFunction
States:
- Type: Task
Name: 調用函數(shù)示例
Action: FC:InvokeFunction
TaskMode: WaitForCustomCallback
Parameters:
resourceArn: acs:fc:{regionId}:{accountId}:functions/dataji/LATEST
invocationType: Async
body:
payload.$: $Input
taskToken.$: $Context.Current.TaskToken
End: true
使用WaitForCustomCallback任務模式時,可以使用表達式$Context.Current.TaskToken
在狀態(tài)定義的Parameters
字段中訪問任務令牌。初始$Context
指定訪問上下文對象的路徑,并在正在運行的執(zhí)行中獲取當前任務的任務令牌。
完成后,外部服務會調用ReportTaskSucceeded - 匯報指定的任務執(zhí)行成功用ReportTaskFailed - 匯報指定的任務執(zhí)行失敗發(fā)送Token及任務執(zhí)行狀態(tài),工作流程才會繼續(xù)進入下一個狀態(tài)。
云工作流與自建服務集成
下圖展示了使用輕量消息隊列(原 MNS)服務結合回調API,實現(xiàn)工作流程與自建服務集成,拓寬云工作流的適用場景, 輕量消息隊列(原 MNS)可以是任何中間存儲服務。