ワークフロー内のデータが複数のステートを経由する場合、各ステートは前のステートの出力を入力として受け取ります。ステートごとに変数を受け渡すと、ステートをまたいだデータの受け渡しが複雑になります。 CloudFlow は、このプロセスを簡素化し、効率を向上させるために、グローバル変数の仕組みを提供しています。
制限事項
これらの制限が要件を満たさない場合は、チケットを送信してください。
項目 | 最大値 |
変数キーの長さ | 128 バイト |
変数値の長さ | 256 KiB |
注意事項
GlobalConstructor内の$Outputは、OutputConstructorの構築結果ではなく、Taskステートの生の出力を参照します。OutputConstructor内の$Globalは、GlobalConstructorによる構築前の生の値を参照します。
コンテキストサイズの制限
CloudFlow が $Global を使用してデータを受け渡す場合、InputConstructor と OutputConstructor の出力は、コンテキストサイズが 64 KiB を超えないようにする必要があります。
競合状態
グローバル変数は、実行レベルのグローバルなキーと値のストレージ領域を提供し、実行のライフサイクル全体を通じてすべてのステートで読み書きが可能です。Map や Parallel などの並列ロジックがフロー内に存在する場合、異なるステート間でデータが上書きされる可能性があります。次の点に注意してください:
Parallelステートの異なるブランチには、異なるキーを使用してグローバル変数を書き込んでください。Mapステートにはグローバル変数を書き込まないでください。Mapのすべてのイテレーション定義は同じであるため、GlobalConstructor内の変数名も同じになります。異なるブランチから書き込まれた同じ変数名は、互いに上書きされます。分散モードの子実行は、親実行のグローバル変数にアクセスできません。これは、子実行と親実行の
Executionレベルが異なるためです。
グローバル変数を使用したデータの受け渡し
グローバル変数は、実行レベルのキーと値のストレージ領域を提供します。ワークフロー内のどのステートでも、ステートの終了時にグローバル変数にデータを書き込み、そのデータを他のステートに渡して利用できます。
上の図では、ステート A は GlobalConstructor を使用して、上流の入力から取得した $Input.key_a に対応するデータを、グローバル変数の variable_a に保存します。また、ステート A は GlobalConstructor を使用して、ステート A の出力内の $Output.key_b に対応するデータを、グローバル変数の variable_b に保存します。ワークフローは InputConstructor を使用して、グローバル変数内の variable_a と variable_b の値を抽出し、これらの値をステート Z に入力として渡します。このようにして、ステートをまたいだデータの受け渡しが実現されます。
CloudFlow ワークフローの入力と出力は、タスク間でデータを明示的に受け渡すために使用され、タスクの独立性と明確性を確保するのに役立ちます。グローバル変数は、タスクをまたいだ共有状態またはグローバルリソース構成を維持するために使用されます。入力、出力、およびグローバル変数を組み合わせて使用することで、効率的で柔軟なシステム設計が実現されます。上の図は、InputConstructor、OutputConstructor、および GlobalConstructor を比較したものです。説明:
InputConstructor($Context,$Global)、OutputConstructor($Context,$Global)、およびGlobalConstructor($Context,$Global)は、InputConstructor、OutputConstructor、および GlobalConstructor が$Contextと$Globalを参照して情報を抽出できることを示します。$Global=Merge($Global,GlobalConstructor($Context,$Global))は、GlobalConstructorによって構築された変数が$Global内の既存の変数とマージされ、すべての変数が$Globalに保存されて共有グローバル変数が更新されることを示しています。$Outputは、Taskの呼び出し結果です。呼び出しが非同期コールバックモードで開始された場合、$Outputの値はコールバックの結果になります。-
図では、
$Globalはグローバル変数を表し、ワークフロー実行全体を通じてアクセス可能です。
グローバル変数の作成と更新
グローバル変数は、GlobalConstructor を使用して作成および更新されます。ステートの実行が終了すると、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: trueGlobalConstructorのデータ構造はMap[String]Anyです。InvokeFunctionResultHeader.$: $Output.HeaderとInvokeFunctionResultBody.$: $Output.Bodyは、関数の戻り値のヘッダーとボディが、グローバル変数のInvokeFunctionResultHeaderキーとInvokeFunctionResultBodyキーにそれぞれ保存されることを示しています。
グローバル変数の読み取り
CloudFlow は、グローバル変数を読み取るために $Global キーワードを定義しています。式の構築をサポートするすべてのシナリオにおいて、$Global を使用して現在の実行のグローバルストレージ領域にアクセスできます。ステートは、明示的なキーを使用してグローバルストレージ領域から値を抽出できます。次のステートマシン定義は、$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
InvokeFunction1ステートはGlobalConstructorを実行し、その戻り値のボディをグローバル変数のInvokeFunctionPayloadキーに保存します。InvokeFunctionステートは、Parameters内の$Global.InvokeFunctionPayload式を使用して、グローバルストレージ領域からInvokeFunctionPayloadキーの値を抽出し、その値をbodyフィールドとしてTaskステートに渡して実行します。-
InvokeFunctionステートは、OutputConstructorを使用して$Global内の値を表示します。実行が完了すると、[ワークフロー出力] パネルにInvokeFunctionPayloadの値が"hello world\n"として表示され、グローバル変数が正常に読み取られたことが確認されます。