概要
- Erlang-RED は、Node-REDのNodeJSバックエンドをErlangで置き換える実験的プロジェクト。
- Erlang の並行処理・メッセージパッシング性能を活かし、Node-REDの低コード・視覚的フロー構築の利点を融合することが狙い。
- Node-REDの既存フローコードとの 高い互換性 を目指すが、JavaScriptで書かれたfunctionノード等は未サポート。
- テスト駆動開発 で進行し、ユニットテストや視覚的テストが統合されているのが特徴。
- Docker・Heroku・Fly.io など多様なデプロイ手段をサポート。
Erlang-RED:Node-REDバックエンドをErlangで再実装する実験
プロジェクトの目的と背景
- Node-REDの NodeJSバックエンド を、 Erlang による100%互換(functionノード等除く)実装に置き換えることを目標とする提案。
- Node-REDは 拡張性・可読性・使いやすさ に優れる一方、NodeJSが シングルスレッド である点が課題認識。
- Erlangは マルチプロセス・並行性 に優れ、 メッセージパッシング を前提とした設計であるため、Node-REDのフロー構築と親和性が高いと判断。
- Erlangの 難解な文法 を、Node-REDの 視覚的・低コード なフロー設計で補完することを目指す発想。
開発戦略
- テストフロー駆動開発 (flow driven development)を採用し、Node-REDのフローと同等の動作をテストで保証する方針。
- テストフローは 別リポジトリ で管理し、保守性とNode-REDとの連携性を確保すること。
- アーキテクチャは ノード間の相互依存 が多く、設計図は複雑になる傾向がある点を認識しつつ進行。
サポート中のノード・機能
- catch :例外キャッチ(グループ未対応)
- change :多くのオペレータ対応、基本的なJSONataもサポート
- complete :一部ノードで利用可能
- csv :RFC4180準拠、カンマ区切りのみ
- debug :メッセージ全体のみ対応、プロパティ単位不可
- delay :静的ディレイのみ、動的ディレイ未対応
- exec :spawnモードでのコマンド実行・kill・タイムアウト対応
- file in :/priv配下のファイル対応
- function :Erlangコードのみ対応、タイムアウト・複数出力未対応
- http in/request/response :GET/POSTのみ、一部制限あり
- inject/join/json/junction/link/markdown/mqtt/noop/split/status/switch/template/trigger :各ノード基本機能を部分的にサポート
- Contexts(flow/node/global) :未サポート
- JSONata :Erlangで部分実装
Elixirとの連携
- Elixirヘルパー をerlang-red-elixir-helpersリポジトリで管理し、ErlangノードからElixirノードも利用可能。
- Elixirコードの直接利用も可能だが、基本はErlang構文を優先。
- Earmark 等のElixirライブラリもErlangノード経由で参照可能。
ビルド・テスト・開発
- ビルド :
rebar3 get-deps && rebar3 compileで依存取得とコンパイル - テスト :
rebar3 eunitでユニットテスト実行 - 開発 :
rebar3 shell --apps erlang_redで開発シェル起動 - エディタ起動 :
open -a Firefox http://localhost:9090/node-redでNode-REDエディタ表示
Docker・デプロイメント
- Docker開発 :リポジトリをクローンし、ボリュームマウント・ポート指定でErlang-REDを起動すること
- リリースビルド :
rebar3 as prod release -n erlang_redでリリースパッケージ作成 - Fly.io :
Dockerfile.flyとシェルスクリプトで簡単にデプロイ可能 - Heroku :コンテナスタック利用、
Dockerfile.herokuで指定フローのみ実行(エディタ無効化も可能)
テスト・ユニットテスト・視覚的テスト
- ユニットテスト :Node-REDのエクスポートダイアログに「Create Test Case」ボタンを追加し、テストフローを視覚的に管理・実行
- assertノード :メッセージ到達でテスト失敗、属性テスト等で正確な検証を実現
- 視覚的ユニットテスト :テスト結果を一覧・個別実行・失敗箇所をデバッグパネルに通知し、フロー実装との互換性を担保
コントリビューションと関連リポジトリ
- Erlangコード・Node-REDテストフロー の貢献を歓迎、Elixirコードは専用リポジトリで管理
- 各テストフローは1機能に特化し、assertノードで検証すること
- ユニットテストフロースイート はNode-RED/Erlang-RED両方で実行可能、FlowHub.orgで管理
- JSONataサポート はErlangパーサーで部分的に実装、必要に応じて拡張可能
- BEAM VM 上で動作するため、Erlang/Elixir等様々な言語の統合が視野
FAQ・コミュニティ
- 質問・議論は Erlang Forum や Node-RED Forum で受付
- 詳細や議論は各種ドキュメント・フォーラム参照
追伸
- Erlang-REDは、Erlangの 軽量プロセス・メッセージパッシング の利点をNode-REDのフローに活かすことを目指すプロジェクト
- HNコミュニティからの フィードバック を歓迎