服务集成模式

云工作流通过使用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

用户自定义回调的工作原理如下图所示。相比较轮询,使用回调有效地降低了延迟、减少了轮询对服务器造成的不必要压力。此外,回调功能配合队列可以实现对非函数计算任务的编排,扩展云工作流的编排范围到任意类型的计算资源。

image

WaitForCustomCallback模式集成流程示例

云工作流与外部微服务集成

本小节以云工作流集成外部微服务执行信用检查为例进行介绍。云工作流发布一条消息至轻量消息队列(原 MNS),消息中包含任务令牌Token。外部微服务与轻量消息队列(原 MNS)集成,从队列中获取消息,然后返回结果和原始任务令牌。接下来云工作流继续执行下面的流程,具体流程信息见下图。

image

示例如下。

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)可以是任何中间存储服务。

image