云工作流通过使用Task类型的状态来调用各种服务,您可以使用三种服务集成模式来控制这些服务调用状态流转。本文介绍请求响应、等待系统回调和等待用户自定义回调三种集成模式的详细信息。
注意事项
您可以使用请求响应(RequestComplete)、等待系统回调(WaitForSystemCallback)和等待用户自定义回调(WaitForCustomCallback)这三种集成模式来集成服务,但不是所有被调用的服务都支持这三种服务集成模式。关于不同服务对三种集成模式的支持情况,请参见集成模式。
请求响应(RequestComplete)
当您在调用任务(Task)状态的服务时,默认集成模式为请求响应模式。当您向服务发出请求时,系统会等待该服务返回响应后再继续执行后续的任务。
以下示例展示如何通过请求响应(RequestComplete)调用一个函数计算的函数。执行这个工作流会调用指定的函数,并等待函数处理的结果。由于是同步调用,状态机会在调用结束后接收到函数返回的结果。
Type: StateMachine
Name: myWorkFlow
SpecVersion: v1
StartAt: InvokeFunction
States:
- Type: Task
Name: 调用函数示例
Action: FC:InvokeFunction
TaskMode: RequestComplete
Parameters:
resourceArn: acs:fc:{regionId}:{accountId}:functions/dataji/LATEST
invocationType: Sync
body: xxxx
End: true
等待系统回调(WaitForSystemCallback)
对于一些任务类的集成服务,以及函数计算异步调用,通过指定等待系统回调(WaitForSystemCallback)任务模式,可以等待任务执行完成后再进入下一个状态。
以下示例展示如何通过等待系统回调(WaitForSystemCallback)调用一个函数计算的函数。
Type: StateMachine
Name: myWorkFlow
SpecVersion: v1
StartAt: InvokeFunction
States:
- Type: Task
Name: 调用函数示例
Action: FC:InvokeFunction
TaskMode: WaitForSystemCallback
Parameters:
resourceArn: acs:fc:{regionId}:{accountId}:functions/dataji/LATEST
invocationType: Async
body: xxxx
End: true
等待系统回调(WaitForSystemCallback)表示工作流会等待任务完成后才进入下一个状态。
如果使用等待系统回调(WaitForSystemCallback)服务集成模式的任务中止流程,云工作流将无法取消该任务,集成服务可能会收取您预期外的费用,因此,需要您自己取消集成任务。仅在以下三种情况下,云工作流可以中止任务。
流程执行已停止。
并行(Parallel)状态的另一个分支因为被捕获的错误而失败。
迭代(Map)状态的迭代失败,错误未被捕获。
流程引擎将尽最大努力取消任务,例如,当前流程采用等待系统回调(WaitForSystemCallback)任务模式,调用包含了子流程或函数计算的异步任务时,调用云工作流的StopExecution - 停止一个正在执行的流程API停止当前流程时,云工作流会停止包含在流程中的子流程, 然后停止包含在流程中的异步任务相关函数执行。但是,流程引擎可能无法取消任务,其原因包括但不限于以下几项。
您的执行角色缺乏进行相应API的调用权限。
发生了临时服务中断。
关于支持等待系统回调(WaitForSystemCallback)任务集成模式的阿里云产品列表,请参见支持普通集成的云服务列表。
等待用户自定义回调(WaitForCustomCallback)
等待用户自定义回调(WaitForCustomCallback)模式又称为携带任务令牌的回调,提供一种暂停工作流,并根据集成服务内部自定义逻辑控制工作流执行的方式。例如,在流程执行中需要等待用户审批场景,通过集成调用发起外部系统的审批流程,直至审批流程完成,回调工作流并返回审批结果,工作流再继续执行后续的流程步骤。一旦发起WaitForCustomCallback类型的集成调用,当前任务的执行将自动暂停,直到集成服务通过调用ReportTaskSucceeded - 汇报指定的任务执行成功或ReportTaskFailed - 汇报指定的任务执行失败接口使得流程继续执行。
Type: StateMachine
Name: myWorkFlow
SpecVersion: v1
StartAt: InvokeFunction
States:
- Type: Task
Name: 调用函数示例
Action: FC:InvokeFunction
TaskMode: WaitForCustomCallback
Parameters:
resourceArn: acs:fc:{regionId}:{accountId}:functions/dataji/LATEST
invocationType: Sync
body: xxxx
End: true
用户自定义回调的工作原理如下图所示。相比较轮询,使用回调有效地降低了延迟、减少了轮询对服务器造成的不必要压力。此外,回调功能配合队列可以实现对非函数计算任务的编排,扩展云工作流的编排范围到任意类型的计算资源。
WaitForCustomCallback模式集成流程示例
云工作流与外部微服务集成
本小节以云工作流集成外部微服务执行信用检查为例进行介绍。云工作流发布一条消息至轻量消息队列(原 MNS),消息中包含任务令牌Token。外部微服务与轻量消息队列(原 MNS)集成,从队列中获取消息,然后返回结果和原始任务令牌。接下来云工作流继续执行下面的流程,具体流程信息见下图。
示例如下。
Type: StateMachine
Name: myWorkFlow
SpecVersion: v1
StartAt: InvokeFunction
States:
- Type: Task
Name: 调用函数示例
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
在状态定义的Parameters
字段中访问任务令牌。初始$Context
指定访问上下文对象的路径,并在正在运行的执行中获取当前任务的任务令牌。
完成后,外部服务会调用ReportTaskSucceeded - 汇报指定的任务执行成功用ReportTaskFailed - 汇报指定的任务执行失败发送Token及任务执行状态,工作流程才会继续进入下一个状态。
云工作流与自建服务集成
下图展示了使用轻量消息队列(原 MNS)服务结合回调API,实现工作流程与自建服务集成,拓宽云工作流的适用场景, 轻量消息队列(原 MNS)可以是任何中间存储服务。