在Node.js中的两个不同进程之间进行通信

Ale*_*kiy 45 process node.js

问题是:

  • 让我们假设我们有两个运行的Node.js进程:example1.jsexample2.js.

  • example1.js那里有作为结果func1(input)返回的函数result1.

  • 有没有办法从内部example2.js呼唤func1(input)并获得result1结果?

根据我对Node.js的了解,我发现了一个使用套接字进行通信的解决方案.这不太理想,因为它需要一个进程监听端口.如果可能的话我希望避免这种情况.


编辑: 经过一些问题我想补充说,在层次结构example1.js中不能是子过程example2.js,而是相反.此外,如果它有帮助 - 只有一个example1.js处理自己的数据,许多example2.js人处理自己的数据+来自第一个进程的数据.

Lin*_*iel 46

您描述的用例让我想到了dnode,使用它可以轻松地公开由不同进程调用的函数,由dnode协调,dnode使用网络套接字(和socket.io,因此您可以在浏览器中使用相同的机制) .

另一种方法是使用消息队列,对于不同的消息队列许多良好的绑定.

我所知道的最简单的方法是使用child_process.fork():

这是spawn()产生Node进程的功能的特例.除了在普通的ChildProcess实例中具有所有方法之外,返回的对象还具有内置的通信通道.频道被写入,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'});
Run Code Online (Sandbox Code Playgroud)

和example1.js:

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

process.on('message', function(m) {
  func(m);
});
Run Code Online (Sandbox Code Playgroud)

  • 这正是IPC所存在的.你问的是如何在没有IPC机制或中间人的情况下进行进程间通信.如果允许进程在没有中间人的情况下与其他非子进程中的数据进行通信,则会出现巨大的安全问题.我同意您应该使用消息队列或redis. (4认同)

Kai*_*cui 6

也许你应该试试Messenger.js.它可以方便地进行IPC.

您不必自己在两个进程之间进行通信.

  • Messenger.js看起来不错,但自2012年以来没有任何活动,包括回答问题. (3认同)

Ale*_*lls 6

使用Redis作为消息总线/代理.

https://redis.io/topics/pubsub

您还可以使用ZeroMQ等套接字消息传递,它们是点对点/点对点,而不是像Redis这样使用消息代理.

这是如何运作的?

使用Redis,在两个节点应用程序中,您有两个Redis客户端在执行pub/sub.因此每个node.js应用程序都有一个发布者和订阅者客户端(是的,Redis pub/sub每个节点进程需要2个客户端)

使用ZeroMQ,您可以直接在node.js进程之间通过IPC通道发送消息(不涉及代理 - 除了操作系统本身......).