所以我有一个用 node.js 编写的应用程序。我在同一台服务器上运行此应用程序的多个实例,并在启动应用程序时使用参数指定它们的“id”,例如:
node app.js <ID>
我希望此应用程序能够从任何其他实例接收消息,并向任何其他实例发送消息。
因此每个实例都在 channel “app<ID>
”上“监听”消息,并且可以将消息发送到从“app1
”到“appN
”的任何 channel 。
实现这一目标的最佳方法是什么?一个 redis 服务器和它的 pubsub 系统? ZeroMQ 或 NSQ 或类似的解决方案?可以使用socket.io吗?
最佳答案
对于进程间通信 (IPC),您可能会考虑 node-ipc这正是您在问题中所描述的。它还具有允许跨不同主机通信的额外好处(如果您曾经在多个服务器上扩展您的应用程序)。
您的应用应该有一个master作为中心枢纽,然后auxiliaries连接到它。
硕士
const ipc=require('node-ipc');
ipc.config.id = 'world';
ipc.config.retry = 1500;
ipc.serve(function() {
ipc.server.on('app.event', function(data, socket) {
// broadcast to all clients
ipc.server.broadcast('app.event', data);
});
);
ipc.server.start();
助动词
const ipc=require('node-ipc');
const EventEmitter = require('events');
// export our event emitter
const events = module.exports = new EventEmitter();
ipc.config.id = 'client' + CID; // CID = from args
ipc.config.retry = 1500;
ipc.connectTo('world', function() {
const _emit = events.emit; // preserve old emit function
ipc.of.world.on('connect', function() {
ipc.log('## connected to world ##', ipc.config.delay);
// override event emitter's emit function
events.emit = function (event, data) {
ipc.of.world.emit('app.event', {
id: ipc.config.id,
event: event,
data: data
});
};
});
ipc.of.world.on('disconnect', function() {
ipc.log('disconnected from world');
// can't emit anymore, so just noop
events.emit = function () {};
});
ipc.of.world.on('kill.connection', function(data) {
ipc.log('world requested kill.connection');
ipc.disconnect('world');
});
ipc.of.world.on('app.event', function(data) {
ipc.log('got a message from world : ', data);
if (data.id !== ipc.config.id) {
// fire events listeners
_emit.call(events, data.event, data.data);
}
});
});
注意:master 也应该连接到自己以接收来自其他辅助设备的事件!如果服务器代码和客户端代码在各自的模块中,那么你只需要从你的master进程中请求master,从每个进程(甚至master)中请求辅助。
关于node.js - N个node.js进程之间的通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34374730/