2

NodeJS Web サイトには、次のように記載されています。強調は私です。

Node.js は、Chrome の JavaScript ランタイム上に構築されたプラットフォームであり、高速でスケーラブルなネットワーク アプリケーションを簡単に構築できます。Node.js はイベント ドリブンのノンブロッキング I/O モデルを使用しているため、軽量で効率的であり、分散デバイス間で実行されるデータ集約型のリアルタイム アプリケーションに最適です。

私は NodeJS が大好きですが、Python、Java、さらには PHP などの既存のテクノロジーと比較して、なぜ NodeJS がスケーラブルなアプリケーションに適しているのかわかりません。

私が理解しているように、JavaScript ランタイムは常に CPU 内の単一のスレッドとして実行されます。ただし、IO はおそらく、カーネルによって提供されるスレッド プールに依存する可能性のある基になるカーネル メソッドを使用します。

したがって、答える必要がある実際の質問は次のとおりです。

  1. すべての JS コードが単一のスレッドで実行されるため、NodeJS は IO が少なく計算量が多いアプリケーションには適していません。
  2. nodejs を使用して Web アプリケーションを作成していて、それぞれが 100 ミリ秒を必要とする純粋な計算を実行する 100 の開いている接続がある場合、そのうちの少なくとも 1 つが終了するのに 10 秒かかりますか?
  3. マシンに 10 個のコアがあり、nodeJS インスタンスを 1 つだけ実行している場合、他の 9 個の CPU はアヒルに座っていますか?

これらの場合に、他のテクノロジーがどのように NodeJS を実行するかについても投稿していただければ幸いです。

4

2 に答える 2

3

私は大量のノードを実行していませんが、これについていくつかの意見があります。私が間違っている場合は修正してください、SO。

すべての JS コードが単一のスレッドで実行されるため、NodeJS は IO が少なく計算量が多いアプリケーションには適していません。

うん。シングルスレッドとは、JS コードで大量のデータを処理している場合、他のすべてをブロックしていることを意味します。そして、それはひどいです。しかし、これはほとんどの Web アプリケーションでは一般的ではありません。

nodejs を使用して Web アプリケーションを作成していて、それぞれが 100 ミリ秒を必要とする純粋な計算を実行する 100 の開いている接続がある場合、そのうちの少なくとも 1 つが終了するのに 10 秒かかりますか?

うん。10 秒の CPU 時間。

マシンに 10 個のコアがあり、nodeJS インスタンスを 1 つしか実行していない場合、他の 9 個の CPU はアヒルに座っていますか?

それはよくわかりません。V8 エンジンには、複数のコアを活用する最適化が組み込まれている可能性があり、プログラマには透過的です。しかし、私はそれを疑います。


問題は、ほとんどの場合、Web アプリケーションは計算を行っていないということです。アプリが適切に設計されていれば、1 つの要求に非常に迅速に応答できます。そして、それを行うために何かを取得する必要がある場合 (データベース、ファイル、リモート サービス)、次の要求を処理する前にその取得が戻るのを待つ必要はありません。

そのため、I/O コールバックがいつ発生するかによって、完了のさまざまな段階で同時にさまざまな段階で多くの要求が発生する可能性があります。一度に JS コードを実行するリクエストは 1 つだけですが、そのコードは必要なことを非常に迅速に実行し、実行ループを終了して、次のイベント コールバックを待機する必要があります。

JS をすばやく実行できない場合、このモデルは問題を引き起こします。お気づきのように、CPU がチャーンするとハングアップします。そのため、その場で多くの集中的な計算を行うノード Web アプリケーションを構築しないでください。

ただし、代わりにリファクタリングして非同期にすることができます。おそらく、計算が完了したときにコールバックを使用して、計算を実行できるスタンドアロン ノード スクリプトがあるとします。Web アプリケーションは、そのスクリプトを子プロセスとして起動し、何かを実行するように指示し、完了時に実行するコールバックを提供できます。ラウンドアバウトな方法で、一種の偽のスレッドができました。


事実上すべての Web アプリケーション テクノロジでは、複雑で集中的な計算をその場で実行することは望ましくありません。適切なスレッドを使用しても、それは負け戦です。代わりに、戦略を立てる必要があります。メインの Web アプリケーション プロセス自体の外部で、バックグラウンドで、または cron ジョブで定期的に計算を行います。

あなたが指摘することは理論上の欠陥ですが、実際には、正しく行わない場合にのみ問題になります。

于 2013-05-28T22:58:00.830 に答える