2012-02-28 58 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