ワークフロー内のデータが複数の状態を通過する場合、各状態は前の状態の出力を入力として受け取ります。変数を状態ごとに渡すと、状態をまたがるデータの受け渡しが複雑になります。 CloudFlow は、このプロセスを簡素化し、効率を向上させるためにグローバル変数メカニズムを提供します。
制限
次の表は、グローバル変数の制限について説明しています。最大値がビジネス要件を満たせない場合は、チケットを送信することで値を増やすことができます。
項目 | 最大値 |
変数キーの長さ | 128 バイト |
変数値の長さ | 256 KiB |
注意事項
$OutputはGlobalConstructor内では、OutputConstructorの構築結果ではなく、Task 状態の生の出力を参照します。$GlobalはOutputConstructor内では、GlobalConstructorによる構築前の生の値を参照します。
コンテキストサイズの制限
CloudFlow が $Global を使用してデータを渡す場合、InputConstructor と OutputConstructor の出力は、コンテキストサイズが 64 KiB を超えないという制限を満たす必要があります。
競合状態
グローバル変数は、実行レベルのグローバル キーバリュー ストレージスペースを提供します。これは、実行ライフサイクル全体を通してすべての状態で読み取りおよび書き込みが可能です。フローにマップやパラレルなどの並列ロジックが存在する場合、異なる状態間でデータが上書きされる可能性があります。次の提案に注意してください。
異なるキーを使用して、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))は、グローバル コンストラクターによって構築された変数が$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 // 戻り値の本文をグローバル変数 InvokeFunctionPayload に格納
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 // グローバル変数 InvokeFunctionPayload を body パラメータとして使用
OutputConstructor:
demo.$: $Global // $Global の値を確認
End: true
状態が実行されると、
InvokeFunction関数はGlobalConstructorを実行して、InvokeFunction1の戻り値の本文をグローバル変数のInvokeFunctionPayloadキーに格納します。InvokeFunctionは、Parametersの$Global.InvokeFunctionPayload式を使用して、グローバル ストレージスペースからInvokeFunctionPayloadキーの値を抽出し、その値をbodyフィールドとしてTask状態に渡して実行します。InvokeFunctionは OutputConstructor を使用して$Globalの値を確認できます。