【问题标题】:Realtime messaging with NodeJS across multiple processes跨多个进程使用 NodeJS 进行实时消息传递
【发布时间】:2012-02-28 20:58:55
【问题描述】:

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

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

【问题讨论】:

  • 有趣的问题。想知道您是否考虑过一个包含统计信息和诸如此类的数据库,然后每个进程会不时地对其进行 ping 操作?
  • 是的,但这会破坏 node.js 的实时性。本质上只不过是轮询。
  • This post 可能是相关的。
  • 查看node.js bindings 以获得zeromq

标签: node.js


【解决方案1】:

查看zeromq,它应该提供一些简单、高性能的 IPC 抽象来满足您的需求。特别是,the pub/sub example 会很有用。

在我不知道 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 的新手,上面的代码完全未经测试,仅用于演示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-21
    • 2020-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-30
    • 2010-09-05
    相关资源
    最近更新 更多