5

マスターが http 要求に応答するノードクラスターがあります。サーバーは、( socket.ioを介して) websocket 接続もリッスンします。クライアントは、前述の WebSocket を介してサーバーに接続します。ここで、クライアントはさまざまなゲームから選択します (各ノード プロセスがゲームを処理します)。

私が持っている質問は次のとおりです。

  • ノードプロセスごとに新しい接続を開く必要がありますか? 正確なノード プロセス X に接続する必要があることをクライアントに伝えるにはどうすればよいですか? (サーバーは着信接続要求をその上で処理する可能性があるため)
  • 新しい接続を開く必要がないように、ノードプロセスにソケットを渡すことは可能ですか?
  • (マスター プロセスで) 1 つの接続のみを使用し、ユーザー メッセージをそれぞれのノード プロセスに渡し、プロセス メッセージをユーザーに戻す場合の欠点は何ですか? (プロセス間でメッセージを送信するときに、かなり大きなオブジェクトをコピーするのに多くのCPUがかかると感じます)
4

1 に答える 1

5

新しい接続を開く必要がないように、ノードプロセスにソケットを渡すことは可能ですか?

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
  }
});

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

しかし、これはTCP状態以外のローカル状態がまだ確立されていないプレーンソケットでのみ機能すると思います。私は自分で確立された webSocket 接続で試したことはありませんが、webSocket が TCP ソケット (暗号化キーなど) を超えて関連付けられたより高いレベルの状態になると、OS が原因で問題が発生するため、それは機能しないと思いますその状態を新しいプロセスに自動的に転送しません。

ノードプロセスごとに新しい接続を開く必要がありますか? 正確なノード プロセス X に接続する必要があることをクライアントに伝えるにはどうすればよいですか? (サーバーは着信接続要求をその上で処理する可能性があるため)

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

(マスター プロセスで) 1 つの接続のみを使用し、ユーザー メッセージをそれぞれのノード プロセスに渡し、プロセス メッセージをユーザーに戻す場合の欠点は何ですか? (プロセス間でメッセージを送信するときに、かなり大きなオブジェクトをコピーするのに多くのCPUがかかると感じます)

デメリットはお察しの通り。マスター プロセスは、パケットを双方向に転送する仲介者として CPU エネルギーを消費する必要があります。この余分な作業があなたにとって重要であるかどうかは、コンテキストに完全に依存し、測定によって決定する必要があります.


ここに私が発見したいくつかの情報があります。接続が最初の socket.io 状態を確立する前に、マスターに着信する socket.io 接続がすぐにクラスターの子に送信される場合、この概念は socket.io 接続でも機能する可能性があります。

これは、実装コードを使用して別のサーバーに接続を送信することに関する記事です。これは接続時にすぐに行われるように見えるため、特定のクラスター宛ての着信 socket.io 接続に対して機能するはずです。ここでの考え方は、特定のクラスター プロセスへのスティッキー割り当てがあり、マスターに到達するすべての種類の着信接続は、状態を確立する前にすぐにクラスターの子に転送されるというものです。

于 2016-03-24T16:48:24.513 に答える