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

问题是:

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

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

  • 有没有办法从example2.js中调用func1(input)并获取result1作为结果?

从我所了解的Node.js中,我只find了一个使用套接字进行通信的解决scheme。 然而这并不理想,因为这需要一个进程在端口上监听。 如果可能的话,我希望避免这一点。


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

你所描述的用例让我想起了dnode ,通过这个dnode你可以很容易的公开被不同进程调用的函数,由dnode来协调,dnode使用networking套接字(和socket.io,所以你可以在浏览器中使用相同的机制) 。

另一种方法是使用消息队列, 对于不同的消息队列有很多好的绑定 。

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

这是产生节点进程的spawn()function的一个特例。 除了正常的ChildProcess实例中的所有方法外,返回的对象还有一个内置的通信通道。 该通道是用child.send(message, [sendHandle])写入的,消息由子'message'上的'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); }); 

可能是你应该尝试Messenger.js 。 它可以方便地做IPC。

你不必自己做两个过程之间的沟通。

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

https://redis.io/topics/pubsub

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

这个怎么用?

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

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