私は初めてnode.jsを使用していますが、アドバイスを期待しています:
サーバーに次のプログラムをインストールしました。
- node.js v0.11.3-pre
- エクスプレス v3.3.4
- socket.io v0.9.14
- connect-redis v1.4.5
- Redis サーバー v=2.6.14
- redis-cli 2.6.14
まず、エクスプレスアプリを作成しました:
express testApplication
作成された「package.json」で、必要なすべての依存関係を定義しました。
最初から、「cluster.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();
});
「app.js」ファイルで、socket.io の保存用に REDIS を定義しました。
io.set('store', new RedisStore({
redisPub: pub,
redisSub: sub,
redisClient: client
}));
これまでのところ、とてもうまくいっています。これはすべてうまく機能しています。
クライアントが socket.io サーバーに接続すると、クラスターはさまざまなワーカーとの接続を処理します。
私の意図は、クライアントが特定の別のクライアントにメッセージを送信できるようにすることです。そのため、socket.io サーバーは受信者からソケットを見つけて、このユーザーにのみメッセージを送信する必要があります。私にとっての解決策は、すべてのユーザーに対して作成されたすべてのソケット ID を配列に格納し、メッセージを送信するときに、配列内の関連するソケット ID を選択し、ID でソケットを取得し、メッセージをソケットに送信することです。 )。
これは、1 つのサーバーでのみ実行されている socket.io アプリケーションでは非常にうまく機能します。 今、同じプログラム、モジュール、およびパッケージを使用して別のサーバーを構成したいと考えています。 負荷分散は、おそらくHAProxyによって処理されます。そのため、socket.io 接続 (ソケット) はServer AとServer Bで保存および管理されます。
シナリオ例:
ユーザー Aはサーバー Aに接続し、ユーザー Bはサーバー Bに接続します。つまり、ユーザー A はサーバー A にソケットを持ち、ユーザー B はサーバー B に持っています。
アプリケーションは、メッセージを送信するためにサーバー B 上のユーザー B のソケットを探す必要があることをどのように認識できるのでしょうか? サーバー B で作成されたため、サーバー A ではソケットが見つかりません。
ありがとう!