10

少しの間、node.jsでコーディングを始めました。これが私の質問の1つです。

HTTP アプリでは、要求応答モデルが与えられているため、すべてのバックエンド タスクが完了して応答がクライアントに返されるまで、単一のアプリスレッドがブロックされるため、パフォーマンスの向上は、次のようなバックエンドの微調整にのみ限定されるようです。 IO リクエストの並列化。(まあ、この改善は、多くの重く独立したIO 操作が関係している場合に重要ですが、通常、この状態は、データ構造を再設計することで、大量の IO 要求を排除でき、最終的にさらに優れたパフォーマンスが得られる可能性があることも意味します。並列化された操作を発行するだけではありません。 )

それが本当なら、Java (または PHP、Python など) に基づくフレームワークよりも優れたパフォーマンスを生み出すにはどうすればよいでしょうか?

また、node.js イベント ループの理解という記事も参照しました。この記事では、その状況についても説明しています。

実際には単一のスレッドが実行されています。並列コード実行はできません。たとえば、「スリープ」を実行すると、サーバーが 1 秒間ブロックされます。

while(new Date().getTime() < now + 1000) {
   // do nothing
}

…ただし、コード以外はすべて並行して実行されます。

私は個人的に、「スリープ」コードを 1 つの IO コールバック クロージャーに正確に入れることで確認し、このコールバックにつながるリクエストを送信してから、別のリクエストを送信しました。どちらの要求も、処理時にコンソール ログをトリガーします。そして私の観察では、後者は前者が応答を返すまでブロックされていました。

では、両方の側がいつでもイベントを発行し、メッセージを相互にプッシュできるソケットモードでのみ、その非同期処理機能の全能力が利用されることを意味するのでしょうか?

私はそれについて少し混乱しています。コメントやアドバイスは大歓迎です。ありがとう!

アップデート

この質問をするのは、いくつかのパフォーマンス評価ケースが報告されているためです。たとえば、Node.js が Enterprise を引き継いでいます – 好むと好まざるとにかかわらずLinkedIn は Rails から Node に移行しました: 27 台のサーバーが削減され、最大 20 倍速くなりました。一部の急進的な意見では、J2EE は完全に置き換えられると主張しています

4

3 に答える 3

7

NodeJS は libuv を使用するため、IO 操作はノンブロッキングです。はい、Node アプリは 1 つのスレッドを使用しますが、すべての IO 要求はイベント キューにプッシュされます。次に、リクエストが行われると、そのレスポンスがソケット、ファイルなどからゼロタイムで読み取られないことは明らかです。したがって、キューで準備ができているものはすべてポップされ、処理されます。それまでの間、リクエストに答えることができます。チャンクまたは完全なデータを読み取る必要があるかもしれませんが、それらはキューで処理されるのを待っているだけです。これは、イベントがなくなるまで、または開いているソケットが閉じられるまで続きます。その後、NodeJS は最終的にその実行を終了できます。

ご覧のとおり、NodeJS は他のフレームワークとは異なり、かなり異なります。マトリックス操作、画像とビデオの処理など、長時間の非 IO 操作がブロックされている場合は、別のプロセスを生成してジョブを割り当て、TCP や IPC と同じようにメッセージ パッシングを使用できます。

NodeJS の主なポイントは、適切に使用しないと大きなオーバーヘッドをもたらす不必要なコンテキスト スイッチを削除することです。NodeJS では、なぜコンテキスト スイッチが必要なのですか? すべてのジョブはイベント キューにプッシュされ、複数の IO/s を作成するために行うすべての処理 (db からの読み取り、db の更新、クライアントへの書き込み、ベア TCP ソケットへの書き込み、キャッシュからの読み取り) のため、おそらく計算量は少なくなります。途中でやめて別の仕事に切り替えるのは論理的ではありません。そのため、libuv の助けを借りて、準備ができている IO をすぐに実行できます。

参考までに、libuv のドキュメントを参照してください: http://nikhilm.github.io/uvbook/basics.html#event-loops

于 2013-04-27T23:50:39.613 に答える
-2

私の経験(簡単ではありますが)がnode.jsに関する限り、node.jsドキュメントのどこかに記載されているように、node.jsサーバーのパフォーマンスをtomcatなどの他のWebサーバーと比較できないことに同意します

実際には単一のスレッドが実行されています。並列コード実行はできません。たとえば、「スリープ」を実行すると、サーバーが 1 秒間ブロックされます。

そのため、Tomcat のような本格的な Web サーバーの代わりとして使用するのではなく、Tomcat から負荷を分散してシングル スレッド モデルを利用できるようにするために使用しました。したがって、どこかでトレードオフする必要があります

http://www.sitepoint.com/node-js-is-the-new-black/も参照してください。これは、node.js に関する美しい記事です。

于 2013-04-27T15:20:23.093 に答える