« 2018年10月 | トップページ

Node-RED: joinノードでタイムアウト処理

Node-REDアドベントカレンダーからの転載です(SRA Advent Calendar 2018からもリンクしています)。

はじめに

Node-REDで通信をする際のタイムアウト処理は、ユーザディレクトリ(~/.node-red)のsetting.jsで変更することができます。例えば、httpリクエストのタイムアウトは、httpRequestTimeoutで変更できます。

しかし、全体の処理時間に制限がある場合など、呼び出し先などによって変更したい場合は対応できません。オーソドックスな方法はファンクションノードで頑張ることかもしれませんが、それではデバッグノードで簡単にデバッグするというNode-REDらしい開発ができません。そこで、標準ノードであるjoinノードを使って、呼び出しの際のタイムアウトを処理する方法を考えてみました。

joinノード

joinノードはsplitノードと組み合わされることが多く、配列などをsplitノードで分割し、それぞれを非同期に処理した後にjoinノードでまとめるという使い方をされます。実はjoinノードは単体でも利用可能で、複数のmsgオブジェクトをタイムアウト時間内にまとめて出力することができます。これを利用するわけです。

具体的には、httpリクエストの直前でmsgオブジェクトをリクエスト処理用とタイムアウト処理用に作成して利用します。joinノードでは、まとめる単位ごとに共通のidが必要で、これにはmsg._msgidを使っています。また、総数のcount、それぞれのmsgオブジェクトを識別するindexが必要です。

joinノードでは結合対象のプロパティ以外には破壊的ですので、結合対象のプロパティに保存しておきたいデータをコピーしておきます。

フロー

実際のフローが下記になります。テスト用サーバーがあるので複雑に見えますが、主要な処理は上部の7つほどのノードだけです。

Timeout_flow

ポイントは、joinの前に必要なプロパティをセットすることです。また、タイムアウトの際にはチェック用のメッセージが流れた後でhttpのレスポンスが返ってきますのでこれを捨てる必要があることです。

上部のcatchノードはタイムアウトの際に例外が発生するのでつけていますが、この辺はお好みで変更してください。

注意点

更新処理の場合、クライアント側でタイムアウトしてもサーバで処理が行われる可能性がありますので注意してください。

コード
元記事の下のほうになるコードをインポート(読み込み)して使ってください。

このエントリーをはてなブックマークに追加


大切なことはスタートレックから学んだ(総集編)

SRAアドベントカレンダーからのまとめです。

エンジニアの誇り

スタートレックとは宇宙大作戦から始まるSFテレビドラマシリーズです(wikipediaU.S.S. Kyushu)。複数の番組があり、制作された時代によって背景にあるテーマ(価値観)が異なっていて様々な刺激を感じます。

バブル崩壊後に公開されたスタートレック:ヴォイジャーは、バブル期のイケイケどんどんから新たな歩みを一歩ずつ進めていこうとする言葉がありました。

「栄光を築くのは戦士かもしれないけど、社会を築くのはエンジニアよ」

         スタートレック:ヴォイジャーの トレス中尉の言葉

戦士のところを企業戦士と読み替えてみてください。企業において営業や経営層は、売り上げに責任を持つことから、評価が高いかもしれませんが、実際にシステムを開発するのはエンジニアです。

利用者に喜ばれるシステムを作ることで信頼を勝ち取り、企業活動を通じて社会に貢献することで、その存続を担うのはエンジニアの仕事です。

開発が遅れたり、トラブルが生じる方が会社の利益になることもあるでしょうけど、「社会を築く」という誇りがより良いシステムの開発に我々を向かわせるのだと思います。

新しい技術への挑戦

多くの刺激を受けたのは、バブル期の「新スタートレック」というシリーズです。科学技術の発展でお金があれば何でもできるような社会風土の中で、人間や家庭に対して問いかける場面が多くあります。

「生まれつきの親なんて一人もいませんよ。みんな苦労しながら学ぶんです。」

            by カウンセラートロイ@新スタートレック4-4

もっと早く聞きたかった言葉です。うまくいかないと、何かにつけて自分はダメだ、向いていないと思ってしまいがちです。しかし、全知全能なのは神様だけで、人間は完ぺきではありません。うまくいかなければ、勉強すればよいのです。

技術者は、新しい技術に常に立ち向かわなければなりません。経験のある環境でもバージョンアップでトラブルに合うこともあるでしょう。

常に学ぶことを忘れない。エンジニアに求められていることです。

プロジェクト

スタートレックのすべてのシリーズに男女間の話が出てきます。坂本龍馬が世の中の情勢を男女間の話に例えたように、プロジェクトを男女間の話に例えると学びも得ることができます。

「あんな恋は二度と無い」
「そうよ」
「意外なセリフ」
「また恋はする。でも同じ恋は二度とないわ。いつもちがうの」
「恋って難しいね」
「そういうものよ」

                  新スタートレックより

恋をプロジェクトに置き換えてみてください。プロジェクトは常に新しい何かを作る仕事ですから、同じプロジェクトは2度とありません。だから、いつも難しいのでしょう。

理念の大切さ

スタートレックは未知の宇宙を航海するドラマです。未知の文明に遭遇した際に影響を与えてしまわないことが、重要な理念になっています。

そのほかにも惑星連邦憲法があって、裁判を行う際には重要な役目を果たします。しかし、未来においても裁判で不条理な主張をする人間がいます。そこで、ピカードが言った一言。

「憲法の基本理念を勝手に覆す事はできない」

           ピカード@新スタートレック シーズン4 第21話

アジャイル開発が話題になりだした頃、クレド(信条)が話題になりました。会社や組織が同じ方向を向くためには必要なものです。

SRAにもクレドのようなものがありますが、聞く機会も少ないので暗記している人はあまりいないでしょう。とはいっても、その中に「プロフェッショナル集団である」という言葉があることだけは、多くの人が知っています。そのことが技術志向の会社であることにつながっています。

もちろん、SRAにもそうではないと思う人はいるでしょうが、その理念は勝手に覆すことはできないのです。

組織の考え方

スタートレックは宇宙ステーションが舞台のDS9を除いて、戦闘能力を持つ宇宙船のお話です。登場人物はピラミッド構造の組織に属し、上長の命令は絶対です。

しかし、惑星連邦の理念に反する場合や緊急事態では、命令に反することも行われます。今回は、そんな場面でのピカード艦長の言葉を紹介しましょう。

「私は命令に従っただけです」という言葉でどれだけほと多くの過ちが正当化されてきたと思う。自分の考えを持たず、ただ命令に従うだけの士官なら連邦には要らない。

                ジャン・リュック・ピカード@新スタートレック

このような上長の懐の深さが、組織を健全に保つのだと思います。

SRAでも上長に反論するような気骨のある人間を喜ぶ人が少なからずいて、オープンで風通しの良い環境を保っているのだと思います。気骨のある人は、ぜひSRAにお越しください。

このエントリーをはてなブックマークに追加

Node-REDで世界が変わる!

SRA Advent Calendar 2018 3日目の記事の複製です。)

ソフトウェアの世界は時間をかけながらではありますが、昔に比べると大きく変化しました。

その大きな要因は、ビジネス環境の変化が激しくなったことです。激しい変化に合わせてサービスを早く提供しなければならなくなりました。サービスの実装も変化に柔軟に対応するできるように、より小さな単位で開発する一方で、それらを組み合わせてより大きなシステムが構築されるようになりました。また、組み合わせる対象も、実行環境や共通部品などは一から開発するのではなく、オープンソースやクラウドなどいわゆる「有りもの」を利用するようになりました。

Node-REDはこのように変化したソフトウェアの世界に適した特徴を持つ開発環境です。Node-REDを使えば新しいサービスで、新しい世界を築くことができます。ソフトウェア技術者にとって、それはかけがえのない喜びです。

サービスを早く提供する

ビジネスのスピードが速くなるにつれて、サービスを早く提供することに対する要求は日ごとに増してきました。

特に、近年のシステムは、

  • UI/UXのように使わないと良し悪しがわからない
  • 複数のモジュールが関連するので、作らないと実現可能性や問題点がわからない
  • クラウドやネットワークなど、運用しないと費用がわからない

といったことが多く、ビジネスに負けないためにはより早くサービスを提供する必要があります。

システムを早く提供するには、いくつかの方法がとられてきました。最初に行われたのは、高機能な言語やライブラリを用意することです。プログラムの記述を少なくして、実装時間を減らしたのです。

次に行われたのは自動化です。古くはmakeコマンドから始まるこの流れは、ビルドやデプロイ、テストの自動化に発展しました。そして、実装後の時間を短縮しました。

そしてインクリメンタルな開発が最後に行われました。システムが複雑になるにつれ、上流の工数はどんどん増え、サービス開始まで時間がかかるようになりましたが、実際に動かすと問題が生じて手戻りの生じることもありました。

そこで、小さな単位で実装を繰り返して、リリースを早めるようになりました。これは、仕様に対する問題を随時解決して大きな失敗を防ぐ、いわゆる「早めに小さく失敗する」ことにもなりました。

Node-REDにはこのようにサービスを早く提供することを可能にする仕組みがあります。

より小さく、より大きく

ビジネス環境の変化が速くなると、サービスを提供した後も柔軟に対応できるとともに、サービスを継続的に利用できることが求められるようになりました。

そこで、従来のようにモノリシックな1つのシステムではなく、小さな機能ごとに実装して組み合わせることで、システム全体を止めることなく、バージョンアップや保守できる構成がとられるようになりました。

そのような仕組みを実現するには、融通の利かないソフトウェアを中心に周辺のソフトウェアで調整する方法では難しく、それぞれのソフトウェアが柔軟であることが求められます。また、小規模システムでも動作すること、様々な機能を容易に組み合わせられることが必要です。

Node-REDには以下のような特徴があるので、小さなソフトウェアを組み合わせて柔軟なシステムを作ることができます。

有りものをうまく利用する

上にあげたような対策をとっていても、すべてを1から作っていたのでは開発規模が大きくなってしまいます。サービスを早く提供するには、オープンソースやクラウドなどいわゆる「有りもの」を利用して、効率よくシステムを構築する必要があります。

Node-REDには、モジュールやソースの交換が容易が容易な仕組みがあり、すでに多くのオープンソースのノード(モジュール)やフロー(プログラム)が流通しています。

おわりに

このようにソフトウェアの世界の変化に対応できる仕組みや環境が、Node-REDにはそろっています。その大きな要因であるビジネスの激しい変化に合わせて、サービスを早く提供することができるでしょう。

しかし、プロトタイプと同じように早く開発できるだけでは、品質の高いソフトウェアを開発することはできません。ある程度大きなソフトウェアを開発するには、きちんと設計をしないとうまくいきません(Node-REDで品質の高いソフトウェアを開発する

Node-REDは(1)ノードに処理を表す名前(日本語可)をつければ手順を理解しやすくなりますし、最近のバージョンではグローバルなどコンテキストデータの構造や値を参照できますし(Version 0.19 released)、通信インタフェースを使って仕様の確認が可能です。

このようなNode-REDの特徴を生かしながら設計と確認を繰り返せば、大規模なソフトウェアの開発も可能でしょう(プロのためのNode-RED再入門)。

今までにない世界を作って、多くの人に幸せにすることはエンジニアの特権で、こんなに楽しいことはありません。あなたもNode-REDを使って、ぜひ新しい世界を切り開いてください。

このエントリーをはてなブックマークに追加


« 2018年10月 | トップページ