Node.js を実行する Web サーバーがある場合、同時に複数の要求を処理できますか? 私の予備テストから、主にシングル スレッドである Node が現時点で処理できる HTTP リクエストは 1 つだけであることがわかります。ただし、1 つの要求の完了に時間がかかりすぎる場合 (たとえば、大きなデータのアップロード)、他のすべての要求は待機する必要があります。
この状況の回避策はありますか? 複数の HTTP リクエストを同時に処理できるようにコードを記述できますか?
Node.js を実行する Web サーバーがある場合、同時に複数の要求を処理できますか? 私の予備テストから、主にシングル スレッドである Node が現時点で処理できる HTTP リクエストは 1 つだけであることがわかります。ただし、1 つの要求の完了に時間がかかりすぎる場合 (たとえば、大きなデータのアップロード)、他のすべての要求は待機する必要があります。
この状況の回避策はありますか? 複数の HTTP リクエストを同時に処理できるようにコードを記述できますか?
ノードがシングル スレッドであるという事実は、一度に 1 つの要求しか処理できないということを必ずしも意味しません。
Nodeの多くのことは意図的に非同期です。多くのファイル システム操作、DB クエリなど。これは次の考え方です。
これには時間がかかると思いますので、完了したら電話してください。それまでの間、あなたが完了するのを待つのではなく、操作のシングル スレッドをより有効に活用します。 .
その時点で、他の作業(他の要求である可能性があります) が処理されます。もちろん、非同期操作を実行する必要がある場合は、他の操作が完了しているため、操作の流れは以前に中断した場所に戻る可能性があります。
大規模なアップロードが行われている状況では、着信ストリームは非同期で処理され、data
eventを通じて管理されます。このストリームをディスクに書き込む場合も、非同期で書き込みを実行できます。つまり、ファイルのアップロード プロセス中に、他のリクエストを処理できるポイントがあります。
複数の CPU コアがある場合にのみ、操作の複数のスレッドを持つことが有益です。その後、操作の各スレッドは異なるコアで実行できます。これを行うために、Node にはcluster
モジュールがあります。これを確認する必要があります。
node.jsでわかるように、ノンブロッキングI/Oサーバープラットフォームがあります。そのため、複数のリクエストを同時に処理できます。例:-
ケースとしてファイル処理を検討してください:-
var fs=require("fs");
console.log("starting");
fs.readFile("path-to-file", function(error, data){
console.log("Content:"+data);
});
console.log("Carry on executing");
出力:-
starting
carry on executing
Content: data
したがって、ファイルの内容を待っている間、コードの実行が続行されることがわかります。
リクエストに時間がかかる場合、それはプロセッサがリクエストを処理するのに時間がかかっているためではありません。これは、データの各チャンクが到着するのを待つのに長い時間がかかるためです。node.js が他のリクエストを処理できるのはこの待機時間であり、これにより非常にスケーラブルになり、他のほとんどのプラットフォームが使用するスレッド モデルよりもはるかに効率的になります。 . 詳細な議論については、Dan Kegelによる C10k 問題を参照してください。
JavaScript イベントは、イベント キューを持つことで機能します。このキューは、イベント (ファイル読み取り操作やサーバー要求からのデータ チャンクなど) が発生するたびに追加されます。結果として得られるイベント処理コードが過度にプロセッサを集中的に使用しない限り、通常、キューはそれほど長くならず、コードはほとんどすぐに実行されます。これが、node.js のほとんどすべてが非同期である理由です。