私が初めての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!
@elchuekoあなたはredisで解決した例を投稿できますか? – patrick