2012-02-28 7 views
1

リアルタイムメッセージングのためにNodeJSサーバーとやりとりするAPIを実装しようとしています。そのNodeJSアプリケーションがHerokuのようなスケーラブルな環境にデプロイされると、このアプリケーションの複数のインスタンスが実行されている可能性があります。複数のプロセスにわたるNodeJSによるリアルタイムメッセージ

複数のノードインスタンスが実行されていても、このチャネルの複数のコピーが存在するにもかかわらず、「メッセージチャネル」に登録されているすべてのクライアントにこのメッセージが届くようにノードアプリケーションを設計できますか?

+0

興味深い質問です。あなたがデータベースを考慮していて、統計情報などを含んでいれば、それで各プロセスが現在とその後にpingしているのだろうか? – Marshall

+0

はい、それはノードのリアルタイムawesomenessを敗北させるでしょう。本質的にポーリング以外のものではありません。 –

+0

[この投稿](http://stackoverflow.com/questions/8490093/node-js-share-sockets-between-processes)が適切かもしれません。 – Marshall

答えて

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:subscriptionに感謝します。 – maerics

関連する問題