web-dev-qa-db-ja.com

Node.jsの2つの異なるプロセス間の通信

問題は:

  • 2つのNode.jsプロセスが実行されていると仮定します:_example1.js_と_example2.js_。

  • _example1.js_には、結果として_result1_を返す関数func1(input)があります。

  • _example2.js_内からfunc1(input)を呼び出し、結果として_result1_を取得する方法はありますか?

Node.jsについて学んだことから、通信にソケットを使用するソリューションは1つしか見つかりませんでした。ただし、ポートでリッスンする1つのプロセスが必要になるため、これは理想的とは言えません。可能であれば、それを避けたい。


編集:いくつかの質問の後、階層に追加したいと思います_example1.js_は_example2.js_の子プロセスではなく、むしろ反対です。また、それが役立つ場合-独自のデータを処理する_example1.js_が1つだけで、_example2.js_が独自のデータ+最初のプロセスからのデータを処理することができます。

45

あなたが説明するユースケースでは、 dnode を考えることができます。これにより、さまざまなプロセスによって呼び出される関数を簡単に公開でき、ネットワークソケット(およびsocket.io)を使用するdnodeによって調整されますブラウザの同じメカニズム)。

別のアプローチは、メッセージキューを使用することです。 さまざまなメッセージキューに対して適切なバインディングが多数あります です。

私の知る限り、最も簡単な方法は child_process.fork() を使用することです。

これは、Nodeプロセスを生成するためのspawn()機能の特殊なケースです。通常のChildProcessインスタンスにすべてのメソッドがあることに加えて、返されるオブジェクトには通信チャネルが構築されます-in。チャネルはchild.send(message, [sendHandle])で書き込まれ、メッセージは'message'子のイベント。

したがって、あなたの例では、example2.jsを使用できます。

var fork = require('child_process').fork;
var example1 = fork(__dirname + '/example1.js');

example1.on('message', function(response) {
  console.log(response);
});

example1.send({func: 'input'});

そしてexample1.js:

function func(input) {
  process.send('Hello ' + input);
}

process.on('message', function(m) {
  func(m);
});

Redisをメッセージバス/ブローカーとして使用します。

https://redis.io/topics/pubsub

また、Redisなどのメッセージブローカーを使用する代わりに、ZeroMQなどのポイントツーポイント/ピアツーピアのソケットメッセージングを使用することもできます。

これはどのように作動しますか?

Redisでは、両方のノードアプリケーションで、pub/subを実行する2つのRedisクライアントがあります。したがって、各node.jsアプリにはパブリッシャーとサブスクライバーのクライアントがあります(はい、Redis pub/subのノードプロセスごとに2つのクライアントが必要です)

ZeroMQを使用すると、IPCチャネルを介して、node.jsプロセス間で直接メッセージを送信できます(おそらくOS自体を除き、ブローカーは関与しません。).

6
Alexander Mills

Messenger.js を試してみてください。 IPCを手軽に実行できます。

2つのプロセス間の通信を自分で行う必要はありません。

6
Kaicui