在Node.js中的两个不同的进程之间进行通信
问题是:
-
让我们假设我们有两个运行的Node.js进程:
example1.js
和example2.js
。 -
在
example1.js
有函数func1(input)
,作为结果返回result1
。 -
有没有办法从
example2.js
中调用func1(input)
并获取result1
作为结果?
从我所了解的Node.js中,我只find了一个使用套接字进行通信的解决scheme。 然而这并不理想,因为这需要一个进程在端口上监听。 如果可能的话,我希望避免这一点。
编辑:经过一些问题,我想补充说,层次结构example1.js
不能是example2.js
subprocess,而是相反。 另外如果有帮助的话 – 只能有一个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进程之间(不涉及代理 – 除了操作系统本身..)。