5

私はnode.jsマスターではありませんので、私はこれについてより多くの視点を持ちたいと思います。クラスターとノードwebworkerを使用した高性能なnode.jsアプリケーションの構築

多くの同時接続だけでなく、長時間実行されるジョブも処理する必要のあるHTTP node.js Webサーバーを作成しています。デフォルトでは、node.jsは1つのプロセス上で実行され、後続の接続の実行に長い時間がかかるコードがある場合、前の接続で何が実行されているかをコードが終了するまで待つ必要があります。例えば

var http = require('http'); 
http.createServer(function (req, res) { 

    doSomething(); // This takes a long time to execute 

    // Return a response 
}).listen(1337, "127.0.0.1"); 

だから私はnode-webworkerライブラリ使用して、別のスレッドですべての長時間実行ジョブを実行するために考えていた:

var http = require('http'); 
var sys = require('sys'); 
var Worker = require('webworker'); 
http.createServer(function (req, res) { 

    var w = new Worker('doSomething.js'); // This takes a long time to execute 

    // Return a response 
}).listen(1337, "127.0.0.1"); 

を、全体の事はよりパフォーマンスにするために、私はclusterを使用して各CPUコア用の新しいノードプロセスを作成することも考えました。

cluster(私はそれをクアッドコアで実行すると4つのノードプロセスを考えてみましょう)と異なるプロセスでクライアント接続のバランスをとることを期待してから、別のスレッドで長時間実行するジョブをnode-webworkerで実行します。

この設定に問題がありますか?

答えて

0

Q-Oper8は、このようなことに対してより柔軟なアーキテクチャを提供する必要があります。全情報:

https://github.com/robtweed/Q-Oper8

+1

最終更新2年前 –

3

私はこのポストは数ヶ月古いですが、私は、誰かが一緒に来た場合に、これに対するコメントを提供したかったことがわかります。

"デフォルトでは、node.jsは1つのプロセス上で実行されます。後続の接続の実行に長時間かかるコードがある場合は、前回の接続でコードが終了するまで待つ必要があります。

^- これは完全に真実ではありません。もしdoSomething();応答を返信する前に完了する必要があります。そうでない場合は、Node.jsのコアで使用可能な非同期機能を使用してすぐに戻り、このアイテムがバックグラウンド。

私が説明してるかの簡単な例では、サーバーに次のコードを追加することで見ることができます。

setTimeout(function(){ 
    console.log("Done with 5 second item"); 
}, 5000); 

サーバーを数回ヒットした場合、あなたは、クライアント上の即時応答を取得します応答が送信されてから数秒後にコンソールがいっぱいになるのを確認します。

1

なぜあなただ​​けコピーしてファイルにコードを貼り付け、

$ jx mt-keep:4 mysourcefile.js 

ようJXcore上でそれを実行し、それがどのように実行されるか表示されません。あなたが本当のマルチスレッドを必要とするならば、JXを試してみてください。その100%ノード.JS 0.12 +互換。あなたはスレッドを生成して、それぞれの中にnode.jsアプリケーション全体を別々に実行することができます。

関連する問題