在云工作流中,数据在多个状态间传递时,每个状态接收前一状态的输出作为输入。但跨多个状态传递数据时,逐层传递变量会增加复杂性。为此,云工作流提供了全局变量机制,以简化跨状态数据传递,提高效率。
使用限制
对于全局变量存在以下限制,如果当前限制不能满足您的需求,您可以通过工单提交向我们反馈。
限制项目 | 最大值 |
变量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
中的值。