コンテンツにスキップ

Fan-outノード

Fan-outノードは、入力配列の要素ごとにサブグラフ(テンプレート)を実行します。各インスタンスは独立したscopeで状態を分離して進行し、設定した数のインスタンスが確定した時点でfan-out自身が完了します。

作業項目の数が実行時にしか分からない場合(例: 前のステップが返したアイテムごとに3つのスキルを走らせたい)で、インスタンスを独立して進めたい場合に使います。項目数が設計時に固定なら、素直に直列エッジを引く方がシンプルです。

フィールド説明
fan_out_source入力データ内、反復対象の配列を指すdot-path。例: .items.data.results
template各項目で実行されるサブグラフ。プロパティパネルの Edit Sub-graph → ボタンから編集。
join_modeFan-out自身がcompletedになる条件。all(デフォルト)/ any / majority
on_failure一部インスタンスが失敗したときの挙動。fail_all(デフォルト)はfan-outを失敗、ignoreは成功分で続行、collectは失敗も下流に渡して検査可能にする。
max_concurrency(任意)同時実行中のインスタンス数の上限。

各テンプレートインスタンスの入力データには以下が含まれます:

キー意味
_itemこのインスタンスが担当する配列要素。
_index0始まりの位置。
_total展開対象の全要素数。

Fan-outが集約した際の出力は以下を含みます:

キー意味
_items各インスタンスの出力(_index順)。
_total / _completed / _failedインスタンス全体のカウント。
  1. cascadeがfan-outに到達すると、runningとして挿入されます。
  2. fan_out_sourceが指す配列が入力から解決されます。空配列なら、空の集約で即finalizeし、cascadeが下流に続きます。
  3. 配列が空でなければ、各要素について、テンプレートのエントリノードが新しいscope(…/<fan-out-id>[index])でpendingとして挿入され、入力データに_item / _index / _totalが添えられます。
  4. インスタンスが完了するごとに、オーケストレータがjoin_modeに対する到達をチェック。条件を満たした時点でfan-outがcompleted(またはon_failureに従ってfailed)に遷移し、集約出力とともに下流へcascadeが続きます。
  • fan_out_source は必須。
  • template サブグラフは必須。
  • template には start / end ノードを含めてはいけません。テンプレートはIn/Outマーカーとio-edgesでエントリ/エグジットを判定します。ルート・エグジットにはskill・conditional・transformなどを使ってください。
  • テンプレートには少なくとも1つの有効なエグジットノードが必要です。
  • テンプレートのIn/Outマーカーは、有効なルート/エグジットにio-edgesで接続されていなければなりません。
  • join_modeall / any / majority のいずれか。
  • 入力エッジがcontractを宣言している場合、fan_out_source はそのcontractのarray型フィールドを指す必要があります。上流出力に期待のリストが載っていない「静かに0件」の失敗モードをこれで捕捉します。
flowchart LR
Fetch["Skill: fetch-items"] --> FO[["Fan-out: .items"]]
subgraph Template
direction LR
Process["Skill: process-item"] --> Verify["Skill: verify-item"]
end
FO --> Process
Verify --> J(("Join"))
FO --> J

全インスタンスの全エグジットノードが確定するとfan-outが完了します。外側グラフで複数の並列ブランチの結果を集約したい場合は下流にJoinを置きます。単純に項目ごとの処理を回したいだけなら、fan-out自身の集約で十分なことが多いです。