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