2013-07-25 16 views
5

私が初めてのNode.jsを使用してアドバイスを願っています:node.js + socket.io + redisアーキテクチャ - 水平のサーバースケーリングソケット接続?

  • Node.jsのv0.11.3-前
  • 特急:

    私は自分のサーバー上で次のプログラムをインストールv3.3.4

  • socket.io v0.9.14
  • 接続-Redisののv1.4.5を
  • のRedisサーバV = 2.6.14
  • のRedis -cli 2.6.14

まず、私は明示アプリ作成:私はすべてのneccessary depencies定義作成 "package.json" で

express testApplication 

を。

私は垂直(マルチプロセス)をスケーリングするためのクラスタを定義した当初から「cluster.js」というファイルに:私はソケットのためのRedisを定義して、私の「app.js」ファイルで

var cluster = require('cluster'); 

if(cluster.isMaster) { 
     var noOfWorkers = process.env.NODE_WORKERS || require('os').cpus().length; 

     console.log("Workers found: " + noOfWorkers); 

     for (var i = 0; i < noOfWorkers; i += 1) { 
       cluster.fork(); 
     } 
} else { 
     require('./app.js'); 
} 

cluster.on('exit', function(worker, code, signal) { 
     var exitCode = worker.process.exitCode; 

     console.log('worker' + worker.process.pid + ' died (' + exitCode + '). restarting...'); 

     if(typeof cluster.workers[worker.id] != "undefined") 
       cluster.workers[worker.id].delete(); 

     cluster.fork(); 
}); 

。格納する:

io.set('store', new RedisStore({ 
      redisPub: pub, 
      redisSub: sub, 
      redisClient: client 
      })); 

これまでのところ、すべてこれはかなりうまくいきます。

クライアントがsocket.ioサーバーに接続すると、クラスタは異なるワーカーとの接続を処理します。

私の意図は、クライアントが特定の別のクライアントにメッセージを送信できることです。つまり、socket.ioサーバーは受信者からソケットを見つけてこのユーザーにのみメッセージを送信する必要があります。私にとっての解決策は、すべてのユーザーのために作成されたすべてのソケットIDを配列に格納し、メッセージを送信するときに配列内の関連するソケットIDを選択し、IDでソケットを取得し、 )。

これは、1つのサーバーでのみ実行されているsocket.ioアプリケーションで非常に有効です。 今、同じプログラム、モジュール、パッケージで別のサーバーを構成したいと考えています。 負荷分散はおそらくHAProxyによって処理されます。 socket.ioの接続(ソケット)は、サーバAサーバBに格納され、管理されます。

シナリオ例:サーバAユーザBに接続

ユーザーがサーバーBに接続します。これは、ユーザーAがサーバーAのソケットとサーバーBのユーザーBのソケットを持っていることを意味します。

アプリケーションが知っていることは、サーバーBのユーザーBのソケットをメッセージ?サーバーAでは、サーバーBで作成されたため、ソケットが見つかりません。

Thx a lot!

答えて

5

水平にスケーリングするときは、サーバー間でデータストアを共有する必要があります。便利なことに、あなたはすでにRedisという理想的なものをすでに持っています。ソケットマッピングを配列に保持する代わりに、それをRedisにプッシュし、そこからルックアップを行う必要があります。

次に、サーバーに相互にメッセージを送信させるか、よりスケーラブルに、レディスを通じてメッセージを送信するかを決めることができます。したがって、各サーバはRedisの待ち行列を見て、どんなメッセージをどのソケットに送るべきか確認します。サーバーはメッセージを受信すると、そのメッセージを配信するサーバー宛のRedisにプッシュします。メッセージの注文が問題になる場合は、Redisの上にレイヤーとしてhttps://github.com/learnboost/kueを見ることをおすすめします。

+0

@elchuekoあなたはredisで解決した例を投稿できますか? – patrick

関連する問題