2016-04-18 17 views
0

pm2を使用して3つのノードインスタンスをスピンしました。彼らはすべて、websocketサーバー(9300,9301、および9302)を使用してサーバーを実行しています。ノードインスタンス間で接続ソケットを切り替える方法は?

私のメインサーバは、nginxロードバランサとして機能します。 nginx上流ブロック:10人のプレイヤーが接続した後

upstream websocket { 
    least_conn; 
    server 127.0.0.1:9300; 
    server 127.0.0.1:9301; 
    server 127.0.0.1:9302; 
} 

、彼らはラウンドロビン方式で分散されています。私はまた、nodeのすべてのインスタンスに対してPub/SubのためにRedisを利用しています。

接続しているプレーヤーが9300の場合、接続が失われずに9302に切り替わる可能性があるのですか?

私のゲームはインスタンスに基づいているからです。もし私が "ゲーム"を持っていれば、そのプレイヤーは作ったり参加したりすることができます。 プレイヤーをゲームの同じノードインスタンスに接続することができれば、私は余分なPub/Subシグナルをすべて減らし、より良い待ち時間を達成できます。

答えて

1

私は彼らの接続を失っていない一方で、9302に切り替えることが インスタンス9300にある接続のプレーヤーのために可能かどう興味津々(それともこれが可能であれば私は思うが、単に好奇心)?

いいえ、できません。 TCPソケットは、2つの特定のエンドポイント間の接続であり、1つのエンドポイントから別のエンドポイントに移動することはできません。これが禁止されている理由は非常に良いセキュリティ上の理由があります(接続をハイジャックすることはできません)。

この問題を回避する一般的な方法は、サーバーにクライアントに再接続を指示し、接続する特定のサーバーへの接続方法を指示することです(特定のポートまたは特定のホスト名などに接続するなど)ロードバランサが使用する可能性があることを意味します)。

+0

これが完成しました。だから、プレイヤーにどのポートに再接続するかを伝えるだけでよいので、両方が同じインスタンスになるようにする必要があります。それは悪くはない、再接続のトレードオフは、ゲームの全生涯にわたってPub/Sub信号を費やしていないのに対して - Thanks @ jfriend00 –

関連する問題