2016-03-24 9 views
0

ノードクラスタ私はマスターがhttp要求に応答するノードを持っています。 サーバーはwebsocket接続もlistenします(socket.io経由)。クライアントは前記ウェブソケットを介してサーバに接続する。今、クライアントは、さまざまなゲームの間で選択します(各ノードプロセスでゲームを処理します)。Webソケットを使用したノードクラスタリング

質問私は、次のとおりている:

  • は、私は、各ノードのプロセスのために新しい接続を開くべきですか?正確なノードプロセスXに接続する必要があることをクライアントに伝える方法は? (サーバーがその上で着信接続要求を処理する可能性があるため)
  • 新しい接続を開く必要がないように、ノードプロセスにソケットを渡すことはできますか?
  • (マスタプロセスで)1つの接続を使用し、それぞれのノードプロセスとプロセスメッセージにユーザーメッセージを戻すだけでは、どのような欠点がありますか?

答えて

2

(私は、プロセス間でメッセージを送信するとき、かなり大きなオブジェクトをコピーするためにCPUの多くの費用がかかると感じ)には 必要がないように、ノードのプロセスにソケットを渡すことが可能です新しい接続を開く?

node.js doc hereで説明されているように、プレーンなTCPソケットを別のノードプロセスに送信できます。

const child = require('child_process').fork('child.js'); 
child.send('socket', socket); 

その後、child.jsで、あなたがこれを持っているでしょう:基本的な考え方はこれです

process.on('message', (m, socket) => { 
    if (m === 'socket') { 
    // you have a socket here 
    } 
}); 

「ソケット」というメッセージ識別子を使用すると、選択した任意のメッセージ名にすることができます - それは特別なものではありません。 node.jsには、child.send()を使用し、送信するデータがソケットとして認識されるコードがあり、プラットフォーム固有のプロセス間通信を使用してそのソケットを他のプロセスと共有するコードがあります。

しかし、これは、TCPステート以外のローカルステートがまだ確立されていないプレーンソケットでのみ有効です。私は確立されたwebSocket接続で自分自身を試していませんが、webSocketがTCPソケット(暗号化キーなど)を超えてより高いレベルの状態を持つと、それが機能しないと想定します。なぜなら、OSその状態を新しいプロセスに自動的に転送することはありません。

ノードプロセスごとに新しい接続を開く必要がありますか? クライアントに正確なノードプロセスXに接続する必要があることを伝えるにはどうすればよいですか?

これはおそらく、新しいプロセスへのsocket.io接続を取得する最も簡単な方法です。新しいプロセスが一意のポート番号でリッスンしていることとCORSをサポートしていることを確認した場合は、既にマスタプロセスとクライアントの間にあるsocket.io接続を取得して、そのクライアントにメッセージを送信できますクライアントに再接続する場所(ポート番号)を知らせます。クライアントは、そのメッセージを待ち受け、その新しい宛先への接続を行うためのコードを含めることができます。

私はちょうど(マスター 過程で)1つの接続を使用し、ユーザに戻って、各ノードのプロセスにユーザーメッセージ とプロセスメッセージを渡した場合の欠点は何ですか?あなたが推測するような欠点がある

(私は プロセス間でメッセージを送信するときにかなり大きなオブジェクトをコピーするために多くのCPUの コストと感じます)。あなたのマスタープロセスは、両方の方法でパケットを転送する中間者であるCPUのエネルギーを費やすだけです。この余分な仕事があなたにとって重要であるかどうかは、文脈に完全に依存し、測定によって決定されなければなりません。


ここに私が発見した情報があります。接続が最初のsocket.io状態を確立する前に、マスタに到着した着信socket.io接続がすぐにクラスタの子に送られた場合、この概念はsocket.io接続でも機能するように見えます。

ここに実装コードのan article on sending a connection to another serverがあります。これは接続時に直ちに実行されるように見えるので、特定のクラスタを宛先とする着信socket.io接続で動作するはずです。ここでのアイデアは、特定のクラスタプロセスへのスティッキー割り当てがあり、マスタに到達するすべての着信接続が、状態を確立する前にすぐにクラスタの子に転送されるということです。

+0

[ドキュメント](https://nodejs.org/api/child_process.html#child_process_child_send_message_sendhandle_options_callback)は、サーバー全体が 'child_process.send'を介して送信できることを指摘しています。 WebSocketServerを別のクラスタに送信できるかどうかはわかりません。この機能は、クラッシュからの接続全体の再接続を避けるのに役立ちます。 – Lewis

+0

@Tresdin - あなたは本当に "サーバー全体"を送信していません。他のプロセスが着信接続をリッスンできるように、着信接続を待機しているソケットを送信しています。一般的なインストールでは、着信webSocket接続は通常、通常のWebサーバーHTTP接続と同じポート(したがってサーバー)を共有するため、通常は別個のWebSocketServerはありません。また、すべてのsocket.io接続がHTTP接続として機能し始め、アップグレードプロセスを経てプロトコルをwebSocketプロトコルに変更することをネゴシエートします。 – jfriend00

+0

@ Tresdin - しかし、はい、リスニングサーバーソケットを別のプロセスに送ることができます。 – jfriend00

関連する問題