node.js - N个node.js进程之间的通信

标签 node.js

所以我有一个用 node.js 编写的应用程序。我在同一台服务器上运行此应用程序的多个实例,并在启动应用程序时使用参数指定它们的“id”,例如:

node app.js <ID>

我希望此应用程序能够从任何其他实例接收消息,并向任何其他实例发送消息。 因此每个实例都在 channel “app<ID>”上“监听”消息,并且可以将消息发送到从“app1”到“appN”的任何 channel 。 实现这一目标的最佳方法是什么?一个 redis 服务器和它的 pubsub 系统? ZeroMQ 或 NSQ 或类似的解决方案?可以使用socket.io吗?

最佳答案

对于进程间通信 (IPC),您可能会考虑 node-ipc这正是您在问题中所描述的。它还具有允许跨不同主机通信的额外好处(如果您曾经在多个服务器上扩展您的应用程序)。

您的应用应该有一个ma​​ster作为中心枢纽,然后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); 
    }
  });

});

注意:ma​​ster 也应该连接到自己以接收来自其他辅助设备的事件!如果服务器代码和客户端代码在各自的模块中,那么你只需要从你的master进程中请求master,从每个进程(甚至master)中请求辅助。

关于node.js - N个node.js进程之间的通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34374730/

相关文章:

json - 文件系统数据

javascript - WebStorm 6 无法识别 Node.js Express 发布方法

php - 如何使用 Node.js 从 PHP 运行 JS 并返回一个值?

特定格式的文件的 JavaScript 正则表达式部分

node.js - 在armv7上编译armv7的nodejs 10.36

macos - Node.js HTTP 服务器端口 8080

Node.js "Server listening on port 3000",但我无法在浏览器中查看它?

javascript - 从使用 Express 的 Node JS 服务器导出一个变量,以便我可以在客户端访问它?

javascript - 如何使用 Electron (如 steam-overlay)创建应用程序

node.js - 如何将生成的 pdf 保存在项目文件夹 Node Jasper Reports 中?