カンタン非同期処理のNode-REDはデータ構造から始めよ!
node.js上で動くNode-REDのプログラムは ノードと呼ばれるモジュールをつなげることで非同期処理を簡単に記述することができます。
ここまでは簡単なプログラミングの説明をしてきましたが、今回は少し大きなプログラムを開発する場合を考えてみます。Node-REDでロジックを書く場合はファンクションノードにJavascriptで用なプログラミングします(カスタムノードを作ることもできます)。
Javascriptというといわゆる「コールバック地獄」(google検索)が連想されますが、Node-REDならノードを分けることで、快適にプログラミングできます。ここでは、なつかしのジャクソン法の命名にならって4つに分類してみましょう。
基本
単純な処理は一つのファンクションノードで書くことができます。
図中のインジェクトノードからmsgオブジェクトを受け取って処理を行い、msgオブジェクトをreturnします。returnしたオブジェクトは次のデバッグノードでデバッグタブに出力されます。
連接
複数のノードを前後につなげます。処理1のノードがmsgオブジェクトをreturnすると、後続の処理2が実行されます。
全体としては非同期処理ですので、途中で外部呼び出しをすると、別の処理が開始されることがありますが、入力データの単位で見ると処理1と処理2は順次的に行われます。
選択
データに応じて処理を分ける場合、出力を複数に分けることができます。配列をreturnするとそれぞれが出力されます。出力が不要な場合は、その番号のところにnullをセットしておきます。
同じデータを渡すだけであれば1つの出力を複数のノードに渡すこともできます。
経験的には出力を複数にすると出力番号順、1つから複数に分けると後続のノードの作成順に実行される様に思いますが、保証されたものではありません。
反復
1つの入力から同じ処理を非同期に複数実行することもできます。node.send(obj)が呼ばれると処理中に、非同期に、後続処理が実行されます。
後続の処理は受け取ったオブジェクトをmsgとして処理しますので、returnで渡す場合と同じ様にnode.send()の引数もオブジェクトでないといけません。
ノード間のインタフェース
ノード間は関数呼び出しではないので引数がありません。Webプログラミングのセッション情報がmsgとして流れていくイメージが近いと思います。
msgはフロー(つまりタブ)をスコープとするFlow contextや全体で共通のGlobal contextと異なって、msg単位で独立しています。しかし引数と違って、ある処理が使わないデータが後続の処理で使われる場合もありますので、むやみに破壊することができません。
チェック&カスケード
安全なノードの基本構造はチェック&カスケードです。入力のmsgオブジェクトをチェックし、必要な処理を行い、受け取ったmsgオブジェクトをそのまま次のノードにカスケードします。
もちろん、msgオブジェクトに追加や変更をすることもありますが、受け取ったmsgオブジェクトを破壊しないことが基本です。
汎用性と保守性は違う
多くの言語では、汎用モジュールを参考にすると保守性の高いプログラミングが可能です。しかし、Node-REDでは注意が必要です。
Node-REDの標準ノードの多くはmsg.payloadをインタフェースにしています。しかし、始端あるいは終端となるノード以外でマネをすると、後続処理がmsg.payloadを退避する必要が生じてノード間の依存が強くなってしまい、保守性が悪くなります。
そこで、データの種類に応じてmsgオブジェクトにプロパティを追加する必要が出てきます。
データ構造から始めよ!
はじめに説明した様にNode-REDはファンクションノードによって、非同期処理を簡単かつ柔軟に扱うことができます。その反面、引数がないのでmsgオブジェクトを誤って破壊しない様に、データ構造をきちんと設計しておくべきです。
命名に用いたジャクソン法の4分類は、プログラムのデータ構造の分類です。それぞれに応じたフローがあるのですから、データ構造をどのようにするかを設計できれば容易に実装できるでしょう。
今回は全て配列をmsgにセットして渡しましたが、「選択」の場合は連想配列にすると見通しが良くなるかもしれません。このあたりは通信プロトコルなどの制約に応じて工夫してください。
おわりに
これまで説明してきた様にNode-REDは、設定中心のプログラミングが可能(Hello World!からNode-REDを知る)、通信に強い(RedmineのREST API を呼ぶ)、 ソーシャルに強い[Node-REDでTwitterのDMからRedmineのチケットを作成する)といった特徴がありますが、今回取り上げた非同期処理が簡単なことは、node.js上のNode-REDならではの特徴でしょう。
Javascriptだとコールバック地獄に落ち入りがちな順次処理が、フローをつなげることで簡単に実現できますし、データ構造にあわせた非同期処理も可能です。
書籍が出版されるなどIoT環境として注目されるNode-RED。ビジュアルでお手軽な点が強調されがちですが、注目されている理由はこの辺りにあるのかも知れません。
« 「なんで?」と「自分だったら」が属人化を防ぐ1 - 必要な時に、必要なものを、必要なだけ - | トップページ | 口説くか、待つか、勧めるか、それとも聞くか - 求められる適性とオブジェクト指向 - »
「Node-RED」カテゴリの記事
- アイデアをシームレスに実装する - 考える道具としてのNode-RED -(2020.12.13)
- [#Node-RED] ファンクションノードのデバッグどうしてる?(2019.12.16)
- Node-RED: joinノードでタイムアウト処理(2018.12.25)
- Node-REDで世界が変わる!(2018.12.01)
- デブサミ関西でNode-REDとペンギンと勇気の話をしました #devsumiB(2018.10.28)
« 「なんで?」と「自分だったら」が属人化を防ぐ1 - 必要な時に、必要なものを、必要なだけ - | トップページ | 口説くか、待つか、勧めるか、それとも聞くか - 求められる適性とオブジェクト指向 - »
コメント