在云工作流中,数据在多个状态间传递时,每个状态接收前一状态的输出作为输入。但跨多个状态传递数据时,逐层传递变量会增加复杂性。为此,云工作流提供了全局变量机制,以简化跨状态数据传递,提高效率。
使用限制
对于全局变量存在以下限制,如果当前限制不能满足您的需求,您可以通过工单提交向我们反馈。
| 限制项目 | 最大值 | 
| 变量Key的长度 | 128 Bytes | 
| 变量Value的长度 | 256 KiB | 
注意事项
- 在 - GlobalConstructor中引用的- $Output是任务(task)的原始输出值,而非经过- OutputConstructor构造后的结果。
- 在 - OutputConstructor中引用的- $Global是- GlobalConstructor构造之前的初始值,而非构造完成后的最终值。
上下文大小限制
通过$Global传递数据时,InputConstructor、OutputConstructor 的输出仍需要符合上下文大小的限制,即不超过64 KiB。
竞态条件
全局变量提供的是Execution级别的全局键值(key-value)存储空间,其在整个Execution的生命周期内对于所有状态(State)都是可读可写的,因此当流程存在并行逻辑(比如 Map、Parallel)时,有产生不同状态之间数据相互覆盖的可能。建议遵循以下实践:
- 在Parallel的不同分支中写入全局变量时,使用不同的Key进行写入。 
- 避免在Map中对全局变量进行写入操作。Map不同于Parallel,Map的每个迭代定义都一样,所以Globalconstructor里面写的变量名称也一样。如果不同分支都写入同一个名称,就会相互覆盖。 
- 分布式模式的子执行因为属于新的 - Execution,所以不能访问父执行的- Global。
通过全局变量传递数据
全局变量提供了Execution级别的键值存储空间,工作流中的任何状态都可以在状态结束时向全局变量写入数据,以将数据传递给其它状态消费。
在上图中,状态A将来自上游输入中的$Input.key_a指向的数据通过GlobalConstructor存储至全局变量中的variable_a,将自身产生的输出中的$Output.key_b指向的数据通过GlobalConstructor存储至全局变量中的variable_b。随后在状态Z中,通过InputConstructor提取了全局变量中的variable_a 和variable_b,将其指向的值作为输入传递给了状态Z,实现了数据的跨状态传递。
云工作流的输入和输出用于任务间显式传递数据,确保任务的独立性和清晰性;而全局变量则用于维护跨任务的共享状态或全局资源配置,两者结合可以实现高效、灵活的系统设计。上图将InputConstructor、OutputConstructor和GlobalConstructor进行对比,详细解释如下:
- 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.Header和- InvokeFunctionResultBody.$: $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键中。
- 函数 - InvokeFunction在- Parameters中通过- $Global.InvokeFunctionPayload表达式提取了全局存储空间中的- InvokeFunctionPayload键对应的值,将其作为- body字段传递给- Task执行。
- 函数 - InvokeFunction通过输出构造可以查看- $Global中的值。