使用NodeJS跨多个进程进行实时消息传递



我正在尝试实现一个API,它与NodeJS服务器交互以实现实时消息传递。现在,当NodeJS应用程序部署到类似Heroku的可扩展环境中时,该应用程序的多个实例可能正在运行。

是否可以设计节点应用程序,使订阅"消息通道"的所有客户端都能接收到该消息,尽管有多个节点实例正在运行,因此也有多个该通道的副本?

看看zeromq,它应该提供一些简单、高性能的IPC抽象来做你想做的事情。特别是pub/sub示例将非常有用。

我认为,在不了解Heroku如何生成多个服务器实例的情况下,主要的挑战将是确定谁是发布者的逻辑(其余实例将是订阅者)。因此,为了论证起见,假设您的托管提供商为您提供了一个名为INSTANCE_NUM的环境变量,它是[0,1024]中的一个整数,表示进程的实例号;所以我们将说实例零是消息发布者。

var zmq = require('zeromq')
if (process.env['INSTANCE_NUM'] === '0') { // I'm the publisher.
  var emitter = getEventEmitter(); // e.g. an HttpServer.
  var pub = zmq.createSocket('pub');
  pub.bindSync('tcp://*:5555');
  emitter.on('someEvent', function(data) {
    pub.send(data);
  });
} else { // I'm a subscriber.
  var sub = zmq.createSocket('sub');
  sub.subscribe('');
  sub.on('message', function(data) {
    // Handle the event data...
  });
  sub.connect('tcp://localhost:5555');
}

请注意,我是zeromq的新手,上面的代码完全没有经过测试,只是为了演示。