75

私は Web プログラミングの経験があまりなく、Node.js で実際にコーディングしたことはまだありません。イベント駆動型のアプローチに興味があるだけです。良さそうです。

この記事では、スレッドベースのアプローチを使用してリクエストを処理するときに発生する可能性のあるいくつかの悪いことについて説明しており、代わりにイベント駆動型のアプローチを選択する必要があります。スレッドベースでは、食品/リソースの準備が整うまで、レジ係/スレッドは私たちと一緒にいます。イベント駆動型では、レジ係はリクエスト キューのどこかに私たちを送ってくれるので、食べ物を待っている間に他のリクエストをブロックすることはありません。ブロッキングをスレッドベースでスケーリングするには、スレッド数を増やす必要があります。私には、これはスレッド/スレッドプールを適切に使用しないことの悪い言い訳のように思えます。

IHttpAsyncHandler を使用して適切に処理できませんでしたか? ASP.Net はリクエストを受信し、ThreadPool を使用してハンドラー (BeginProcessRequest) を実行し、その内部でコールバックを使用してファイル/データベースをロードします。その後、そのスレッドは自由に他のリクエストを処理できるようになります。ファイルの読み取りが完了すると、ThreadPool が再び呼び出されてアクションが実行され、残りの応答が実行されます。私にとってはそれほど違いはありませんが、なぜそれほどスケーラブルではないのでしょうか?

私が知っているスレッドベースの欠点の 1 つは、スレッドを使用するとより多くのメモリが必要になることです。しかし、これだけあれば、マルチコアのメリットを享受できます。Node.jsがスレッド/コアをまったく使用していないとは思えません。

したがって、イベント駆動型とスレッドベースのみに基づいて (「Javascript とすべてのブラウザーのため...」という議論を持ち込まないでください)、代わりに Node.js を使用することの実際の利点を誰かが指摘できますか?既存の技術?

それは長い質問でした。ありがとう :)

4

4 に答える 4

68

まず、Node.js はマルチスレッドではありません。これは重要。スレッド化された環境で完全に動作するプログラムを設計するには、非常に才能のあるプログラマーでなければなりません。スレッドはただ難しいです。

適切に設計されていないスレッド化されたプロジェクトを維持するには、にならなければなりません。非常に大規模なプロジェクトでは、回避するのが難しい問題が非常に多くあります。

次に、プラットフォーム全体が非同期で実行されるように設計されています。すべての IO インタラクションが非同期である ASP.NET プロジェクトを見たことがありますか? 簡単に言えば、ASP.NET はイベント ドリブンに設計されていません。

次に、開いている接続ごとに 1 つのスレッドがあり、全体のスケーリングの問題によるメモリ フットプリントがあります。間違っている場合は訂正してください。ただし、ASP.NET で接続ごとに新しいスレッドを作成しないようにする方法がわかりません。

もう 1 つの問題は、Node.js リクエストが使用されていないとき、または IO を待っているときにアイドル状態になることです。一方、C# スレッドはスリープします。現在、スリープできるこれらのスレッドの数には制限があります。Node.js では、1 つの開発マシンで同時に 10,000 クライアントを簡単に並列処理できます。1 つの開発マシンで 10,000 スレッドを並列処理してみます。

言語としての JavaScript 自体が、非同期コーディングを容易にします。まだ C# 2.0 を使用している場合、非同期構文は本当に苦痛です。多くの開発者は、and をあちこちで定義し、コールバックを使用するAction<>と、混乱するだけです。Function<>イベント方式で作成された ASP.NET プロジェクトは、平均的な ASP.NET 開発者には維持できません。

スレッドとコアについて。Node.js はシングルスレッドであり、複数ノードのプロセスを作成することでスケーリングします。16 個のコアがある場合、node.js サーバーの 16 個のインスタンスを実行し、その前に単一の Node.js ロード バランサーを配置します。(必要に応じて、nginx ロード バランサーを使用することもできます)。

これはすべて、最初から非常に低いレベルでプラットフォームに書き込まれました。これは、後で追加される機能ではありませんでした。

その他の利点

Node.js には、上記よりも多くの機能があります。上記は、イベント ループを処理する Node.js の方法が、ASP.NET で非同期機能を使用して処理するよりも優れている理由にすぎません。

  • パフォーマンス。これは速い。本当に速い。
  • Node.js の大きな利点の 1 つは、その低レベル API です。あなたは多くのコントロールを持っています。
  • HTTP サーバー全体をコードに直接統合してから、IIS にアウトソーシングします。
  • nginx と Apache の比較全体があります。
  • C10K チャレンジ全体はノードによって適切に処理されますが、IIS では処理されません。
  • AJAX と JSON の通信は、自然で簡単に感じられます。
  • リアルタイム通信は、Node.js の素晴らしい点の 1 つです。それはそれのために作られました。
  • ドキュメントベースの nosql データベースとうまく連携します。
  • TCP サーバーも実行できます。ファイル書き込みアクセスが可能で、サーバー上で任意の UNIX コンソール コマンドを実行できます。
  • CouchDB や map/reduce などを使用して、javascript でデータベースにクエリを実行します。クライアントは JavaScript で記述します。Web スタックでの開発中にコンテキスト スイッチはありません。
  • コミュニティ主導のオープンソース モジュールの豊富なセット。node.js のすべてがオープン ソースです。
  • フットプリントが小さく、依存関係がほとんどありません。自分で node.js ソースをビルドできます。

Node.js の欠点

それは難しい。若いです。熟練したJavaScript 開発者として、Node.js を使用して Web サイトを作成するのは、その低レベルの性質と自分が持っている制御レベルのせいで困難に直面しています。それはCのように感じます。私のために使用されるか、私を吊るすための多くの柔軟性と力。

API は凍結されていません。急速に変化しています。それまでに Node.js が大幅に変更されるため、大規模な Web サイトを 5 年で完全に書き直さなければならないことは想像に難くありません。node.js Web サイトのメンテナンスは安くはないことに注意する必要があります。

参考文献

http://blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop/

http://blip.tv/file/2899135

http://nodeguide.com/

于 2011-04-08T18:29:05.713 に答える
17

Node.js コミュニティと ASP.NET コミュニティの文化的な違いを過小評価するのは簡単です。確かに、IHttpAsyncHandlerは存在し、.NET 1.0 から存在しているので、それは良いことかもしれませんが、Node.js に関するすべてのコードと議論は非同期 I/O に関するものであり、.NET に関しては明らかにそうではありません。LINQ To SQL を使いたいですか? あなたはちょっとできる、ちょっと。ものを記録したいですか?「CSharp DotNet Logger」が動作するかもしれません。

はい、IHttpAsyncHandler はあります。本当に注意すれば、どこかでブロッキング I/O につまずくことなく、イベント ドリブンの Web サービスを作成できるかもしれませんが、多くの人が使用しているという印象はあまり受けません。それ (そして、ASP.NET アプリを作成するための顕著な方法ではないことは確かです)。対照的に、Node.js はすべてイベント I/O、すべてのコード例、すべてのライブラリに関するものであり、人々がそれを使用する唯一の方法です。したがって、どのイベント I/O モデルが実際に最後まで機能したかを賭けるなら、おそらく Node.js を選択するでしょう。

于 2011-04-08T18:36:22.980 に答える
1

現在のテクノロジーの改善と以下のリンクを読むと、専門知識の問題であり、特定のシナリオに従って完璧な組み合わせを選択することが重要であると言えます. NodeJS は成熟しつつあり、ASP.NET 側では、ASP.NET MVC、WebAPI、SignalR などを使用して、物事を改善しています。

Node.js と .Net のパフォーマンス

http://www.salmanq.com/blog/net-and-node-js-performance-comparison/2013/03/ および

http://www.hanselman.com/blog/InstallingAndRunningNodejsApplicationsWithinIISOnWindowsAreYouMad.aspx

ありがとう。

于 2013-07-01T14:11:45.413 に答える