5

私は 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");

また、全体のパフォーマンスを向上させるために、クラスターを使用して各 CPU コアに新しいノード プロセスを作成することも考えました。

このようにして、さまざまなプロセスcluster(クアッドコアで実行する場合は4ノードプロセスとしましょう)を介したクライアント接続のバランスを取り、 node-webworker.

この構成に何か問題がありますか?

4

3 に答える 3

3

この投稿は数か月前のものですが、誰かがやって来た場合に備えて、コメントを提供したいと思いました.

「デフォルトでは、node.js は 1 つのプロセスで実行されます。実行に時間がかかるコードがある場合、後続の接続は、コードが前の接続で行っていることを終了するまで待機する必要があります。」

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

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

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

サーバーに数回ヒットすると、クライアント側ですぐに応答が得られ、最終的には、応答が送信されてから数秒後にコンソールがメッセージでいっぱいになります。

于 2012-02-23T23:00:52.663 に答える
1

コードをコピーしてファイルに貼り付け、 JXcoreで実行してみませんか。

$ jx mt-keep:4 mysourcefile.js

そしてそれがどのように機能するかを見てください。シングルスレッドの安全性を離れずに真のマルチスレッドが必要な場合は、JX を試してください。その 100% node.JS 0.12+ 互換性。スレッドを生成し、それぞれのスレッド内で node.js アプリ全体を個別に実行できます。

于 2014-02-19T23:35:51.823 に答える
0

代わりにQ-Oper8をチェックすることをお勧めします。これは、この種のものに対してより柔軟なアーキテクチャを提供するはずだからです。完全な情報:

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

于 2011-09-09T06:19:35.773 に答える