我正在尝试实现一个与NodeJS服务器交互以实现实时消息传递的API。现在,当NodeJS应用程序部署到 Heroku 等可扩展环境时,此应用程序的多个实例可能正在运行。
是否可以设计节点应用程序,以便所有订阅“消息频道”的客户端都会收到此消息,尽管多个节点实例正在运行 - 因此该频道有多个副本?
答案 0 :(得分: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的新手,上面的代码完全未经测试,只是为了演示。