2012-02-28 61 views
1

我试图实现一个与NodeJS服务器进行实时消息交互的API。现在,当NodeJS应用程序部署到可伸缩环境,如Heroku时,此应用程序的多个实例可能正在运行。跨多个进程的NodeJS实时消息传递

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

+0

有趣的问题。想知道如果你考虑一个数据库,包含统计信息和什么,然后每个进程都会不时地ping通? – Marshall 2012-02-28 21:21:09

+0

是的,但那会破坏节点的实时性。基本上只不过是轮询。 – 2012-02-28 21:27:44

+0

[这篇文章](http://stackoverflow.com/questions/8490093/node-js-share-sockets-between-processes)可能是相关的。 – Marshall 2012-02-28 21:32:52

回答

0

检查出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的新手,上面的代码完全未经测试,仅供演示。

+0

@DenizOzger感谢指针re:订阅。 – maerics 2014-02-06 22:36:20