Global IO,全局变量

在云工作流中,数据在多个状态间传递时,每个状态接收前一状态的输出作为输入。但跨多个状态传递数据时,逐层传递变量会增加复杂性。为此,云工作流提供了全局变量机制,以简化跨状态数据传递,提高效率。

使用限制

对于全局变量存在以下限制,如果当前限制不能满足您的需求,您可以通过工单提交向我们反馈。

限制项目

最大值

变量Key的长度

128 Bytes

变量Value的长度

256 KiB

注意事项

重要
  • GlobalConstructor中引用的$Output是任务(task)的原始输出值,而非经过OutputConstructor构造后的结果。

  • OutputConstructor中引用的$GlobalGlobalConstructor构造之前的初始值,而非构造完成后的最终值。

上下文大小限制

通过$Global传递数据时,InputConstructorOutputConstructor 的输出仍需要符合上下文大小的限制,即不超过64 KiB。

竞态条件

全局变量提供的是Execution级别的全局键值(key-value)存储空间,其在整个Execution的生命周期内对于所有状态(State)都是可读可写的,因此当流程存在并行逻辑(比如 Map、Parallel)时,有产生不同状态之间数据相互覆盖的可能。建议遵循以下实践:

  1. Parallel的不同分支中写入全局变量时,使用不同的Key进行写入。

  2. 避免在Map中对全局变量进行写入操作。Map不同于Parallel,Map的每个迭代定义都一样,所以Globalconstructor里面写的变量名称也一样。如果不同分支都写入同一个名称,就会相互覆盖。

  3. 分布式模式的子执行因为属于新的Execution,所以不能访问父执行的Global

通过全局变量传递数据

全局变量提供了Execution级别的键值存储空间,工作流中的任何状态都可以在状态结束时向全局变量写入数据,以将数据传递给其它状态消费。

image

在上图中,状态A将来自上游输入中的$Input.key_a指向的数据通过GlobalConstructor存储至全局变量中的variable_a,将自身产生的输出中的$Output.key_b指向的数据通过GlobalConstructor存储至全局变量中的variable_b。随后在状态Z中,通过InputConstructor提取了全局变量中的variable_avariable_b,将其指向的值作为输入传递给了状态Z,实现了数据的跨状态传递。

image

云工作流的输入和输出用于任务间显式传递数据,确保任务的独立性和清晰性;而全局变量则用于维护跨任务的共享状态或全局资源配置,两者结合可以实现高效、灵活的系统设计。上图将InputConstructorOutputConstructorGlobalConstructor进行对比,详细解释如下:

  • InputConstructor($Context,$Global)OutputConstructor($Context,$Global)GlobalConstructor($Context,$Global)表示输入、输出和全局构造器都可以引用$Context$Global,从中提取信息。

  • $Global=Merge($Global,GlobalConstructor($Context,$Global))表示把全局构造器构造出的变量和$Global中已有的变量合并,存放在$Global中,更新共享的全局变量。

  • 图中$Output表示Task调用之后的返回结果,如果Task的调用是异步回调模式,那么$Output取值就是回调之后的返回结果。

  • 图中$Global用于表示全局变量,其在整个工作流执行过程中都是可访问的。

全局变量的创建和更新

全局变量的创建和更新通过GlobalConstructor完成,在状态执行结束时,会触发GlobalConstructor执行。以下状态机定义示例显示了全局构造器的用法:

Type: StateMachine
Name: MyWorkFlow
SpecVersion: v1
StartAt: InvokeFunction
States:
  - Type: Task
    Name: InvokeFunction
    Action: FC:InvokeFunction
    TaskMode: RequestComplete
    Parameters:
      resourceArn: >-
        acs:fc:cn-hangzhou:123456:functions/myFunction/LATEST
      invocationType: Sync
      body.$: $Input 
    GlobalConstructor:
      InvokeFunctionResultHeader.$: $Output.Header
      InvokeFunctionResultBody.$: $Output.Body
    End: true
  • 全局构造器GlobalConstructor的数据结构为map[string]any。

  • InvokeFunctionResultHeader.$: $Output.HeaderInvokeFunctionResultBody.$: $Output.Body表示将函数调用的返回值中的Header 和Body分别保存在全局变量中的 InvokeFunctionResultHeader 和 InvokeFunctionResultBody 两个键中。

全局变量的读取

云工作流定义了$Global关键字用于全局变量的读取。在任何支持表达式构造的场景,都可以通过$Global访问当前Execution的全局存储空间,状态可以通过明确的键提取全局存储空间中的值。以下状态机定义示例显示了$Global的用法:

Type: StateMachine
Name: MyWorkFlow
SpecVersion: v1
StartAt: InvokeFunction1
States:
  - Type: Task
    Name: InvokeFunction1
    Action: FC:InvokeFunction
    TaskMode: RequestComplete
    Parameters:
      invocationType: Sync
      resourceArn: acs:fc:cn-hangzhou:123456:functions/myFunction/LATEST
    GlobalConstructor:
      InvokeFunctionPayload.$: $Output.Body
    Next: InvokeFunction
  - Type: Task
    Name: InvokeFunction
    Action: FC:InvokeFunction
    TaskMode: RequestComplete
    Parameters:
      resourceArn: acs:fc:cn-hangzhou:123456:functions/myFunction/LATEST
      invocationType: Sync
      body.$: $Global.InvokeFunctionPayload
    OutputConstructor:
      demo.$: $Global
    End: true
  • 函数InvokeFunction在状态执行结束时,执行GlobalConstructor,将函数InvokeFunction1调用的返回值中的Body存在全局变量的InvokeFunctionPayload键中。

  • 函数InvokeFunctionParameters中通过$Global.InvokeFunctionPayload表达式提取了全局存储空间中的InvokeFunctionPayload键对应的值,将其作为body字段传递给Task执行。

  • 函数InvokeFunction通过输出构造可以查看$Global中的值。image