我試圖實現一個與NodeJS服務器進行實時消息交互的API。現在,當NodeJS應用程序部署到可伸縮環境,如Heroku時,此應用程序的多個實例可能正在運行。跨多個進程的NodeJS實時消息傳遞
是否可以設計節點應用程序,使所有訂閱「消息通道」的客戶端都能收到此消息,儘管多個節點實例正在運行 - 因此多個此通道的副本?
我試圖實現一個與NodeJS服務器進行實時消息交互的API。現在,當NodeJS應用程序部署到可伸縮環境,如Heroku時,此應用程序的多個實例可能正在運行。跨多個進程的NodeJS實時消息傳遞
是否可以設計節點應用程序,使所有訂閱「消息通道」的客戶端都能收到此消息,儘管多個節點實例正在運行 - 因此多個此通道的副本?
檢查出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的新手,上面的代碼完全未經測試,僅供演示。
@DenizOzger感謝指針re:訂閱。 – maerics 2014-02-06 22:36:20
有趣的問題。想知道如果你考慮一個數據庫,包含統計信息和什麼,然後每個進程都會不時地ping通? – Marshall 2012-02-28 21:21:09
是的,但那會破壞節點的實時性。基本上只不過是輪詢。 – 2012-02-28 21:27:44
[這篇文章](http://stackoverflow.com/questions/8490093/node-js-share-sockets-between-processes)可能是相關的。 – Marshall 2012-02-28 21:32:52