PR

n8nの並列の動きがおかしい!?調査してみた

n8n並列つなぎ検証 IT
スポンサーリンク

n8nでロジックを組むとき、電池の並列つなぎのようなつなぎ方の挙動が変だと感じた方は多いと思います。

この記事では、n8nワークフローにおける並列つなぎと直列つなぎの動作の違いやTipsを紹介したいと思います。

筆者
筆者

筆者はITエンジニアで、n8nを利用して個人業務の効率化をしたり、技術検証を仕事でも行っています。

本記事でわかること
  • n8nの直列つなぎと並列つなぎの挙動の違い
  • 「電池の並列つなぎ」を実現する方法
スポンサーリンク

n8nの並列つなぎと直列つなぎの挙動の違い

まずは直感的なところから説明していきます。

直列つなぎでワークフローを実装すると、当然以下のように実行されます。

次に、並列の実行順序はどうでしょうか?

直感的にはこの順番だと思いませんか?(特に電池の並列つなぎを思い出すと)

正解は、こちらです。

これは実際に動かしてみるとわかります。

実行数が3となっているのが分かるかと思います。

分岐があると、スタックにタスクが入れられて、実行するものがなくなるまで続いていきます。

最後のノードが6回実行されることからもわかりますね。

このように実行の癖があるため、ロジックの分岐をワークフローの矢印でやろうとすると大変です。

さらに、Expressionの.itemを利用すると、それぞれの実行ごとに通過したノードの出力しか参照できない挙動をします。

この実行順序の場合、Fields7からFields1や4を.itemでは参照できません。

つまり、並列配置をすると、n8nのExpressionでは固定の値しか参照できないためどこかで破綻してしまいます。

この場合、参照に利用するのはFields2を利用するか、.itemにとらわれない.allなどで処理を検討する必要が出てきます。

スポンサーリンク

「電池の並列つなぎ」を実現するには?

ここまで、並列つなぎでは処理が先に進んでいってしまうことを見てきました。

このワークフローのクセがあるため、「電池の並列つなぎ」を実現するには、「処理を一時的に止めて、入力が一定数になると先に進む」という挙動をするノード(Mergeノードなど)やロジックが必要になります。

(ちょっと難しいですが、並列つなぎにすると分岐地点で処理がスタックされます。そこから次の処理を取り出すには、もう動かせるノードがない状態を作る必要があります。それを実現するノードが必要になります。)

直感的な挙動である以下のような「電池の並列つなぎ」を実現する方法を紹介します。

案① MergeノードのAppendを利用する

Mergeノードの設定画面

この設定で実行すると、処理が先に進まずFields12が1回のみ実行されています。

出力がJSONとして並列に結合するような挙動になります。

入力が指定の数に満たない場合は出力が空となります。注意してください。

案② MergeノードのChoose Branchを利用する

OutputにWait for All Inputs to Arriveを設定すると、処理を待つことが可能です。

選んだブランチ(Use Data of Input)の値のみが出力されるので注意してください。

また、入力が不足する場合は処理が後続ノードに続かず、正常終了するため注意してください。

スポンサーリンク

まとめ

n8nのワークフローはクセが強く、各ノードの処理も所見では分かりづらいです。

そのなクセの中でも直列と並列について紹介しました。

理由がわからなくなったらワークフローを分割できないか考えてください!サブワークフローを呼び出すことも可能です。

クセが強いのでn8nを使いこなすには時間をかけて検証を進める必要があります。

例えば、ifノードとMergeノードの組み合わせなどもややこしく、永続化フラグを別で持たせないと実現できないロジックも多いです。

基本的にはフローを分割できないか、CodeノードでJavaScriptやPythonで記述することができないかを考えてみてください。

以上です!

コメント