5

私は初めて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 AServer Bで保存および管理されます。

シナリオ例:

ユーザー Aはサーバー Aに接続し、ユーザー Bはサーバー Bに接続します。つまり、ユーザー A はサーバー A にソケットを持ち、ユーザー B はサーバー B に持っています。

アプリケーションは、メッセージを送信するためにサーバー B 上のユーザー B のソケットを探す必要があることをどのように認識できるのでしょうか? サーバー B で作成されたため、サーバー A ではソケットが見つかりません。

ありがとう!

4

2 に答える 2

6

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

次に、サーバーが互いにメッセージを送信するようにするか、よりスケーラブルに、Redis を介してメッセージを送信するかを決定できます。そのため、各サーバーは Redis のキューを調べて、どのメッセージをどのソケットに送信する必要があるかを確認します。サーバーがメッセージを受信すると、それを配信するサーバーにアドレス指定された Redis にプッシュします。メッセージの順序が重要な場合は、https://github.com/learnboost/kueを Redis 上のレイヤーとして参照することをお勧めします。

于 2013-07-28T10:44:11.947 に答える