私は他の誰かがこれに遭遇したかどうかを確認しようとして掘り下げてきましたが、私はそうではないと思っていました.それが私が見つけたものです.
私が今直面している問題は、私が構築しているアプリケーションのアーキテクチャに関連しています。node.js のゲーム サーバー。現在、サーバーは、すべての子プロセスを制御する単一の「マネージャー」プロセスで起動します。ゲームの各「ゾーン」または「エリア」はcluster.fork()
、個別のプロセスを使用してスピンアップされるため、各「ゾーン」はサーバー上に独自のスレッドを持ち、サーバーがこれらの「ゾーン」の多くを一度に実行する能力を最適化できます。 .
私が今直面しているジレンマはこれです。各「ゾーン」は単一のスレッドで実行されており、そのスレッドは「ゾーン」の同期を維持するために複雑な 3D 演算を 1 秒あたり X 回実行する予定であるため、Socket.io を開きたくありません (通信ゲームクライアントとの通信に使用されるライブラリ) を同じスレッドで使用します。私がハングアップしているのはcluster.on('message')
、マスター プロセスでハンドラーを使用し、Socket.io からマスター プロセスにメッセージをパイプする際のパフォーマンスにあると思いますprocess.send({...})
。
私は、他の誰かがこれについて経験を持っているか、クラスターモジュール全体がどのように機能するか、そして本質的にこれを基本的なレベルで知っているかどうかを確認しようとしています:
呼び出す方が速いですか:
var io = require('socket.io').listen( 1337 );
io.sockets.on('connection',...); //map all the functionality here in the "zone" thread
または、次のようにします。
var cluster = require('cluster');
var io = [];
//arbitrary number for the thread count, not important for theory testing
for( var i = 0; i < 4; ++i) {
var process = cluster.fork({...});
process.on('message',myRelayFunction);
io.push( process );
}
もちろんcluster.fork()
、socket.io 接続を開き、さまざまなクライアントからのメッセージを「ゾーン」プロセスに中継するだけのスクリプトに呼び出しがパイプされていると仮定します。
これでパフォーマンステストを実行してみましたが、テストする出力を得るために接続でマシンを飽和させるのが難しいため、これが高速かどうかを判断するのは非常に困難です。
これがスケーラブルであることを確認して、より重い負荷の下で、アプリケーションがサーバー上の複数の CPU コアを最大限に活用できるようにしたいと考えています。もちろん、socket.ioリスナーを複数のスレッドにマルチスレッド化する必要があると言っていますが、私の懸念は、それらはすべて技術的に単一のスレッド化されたプロセスにパイプバックしているため、マルチのパフォーマンス向上の可能性を犠牲にしないことです-それらをスレッド化しますか? ここのテスト/ベンチマーク部門では、私はちょっと空虚になってきています.これがどのようにうまく機能するかの背後にある理論が、ここで何が最善の基本的なアプローチであるかを言うのに十分ではありません.誰かがこれについて持っている入力;)