1. ホーム
  2. asp.net

Node.jsのイベントドリブンはそんなに違うのか?ASP.NetのHttpAsyncHandlerではできないの?

2023-11-20 05:19:58

質問

私はWebプログラミングの経験があまりありません。 Node.jsでまだ何もコーディングしていません。 イベントドリブンアプローチ . それは良いように見えます。

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

IHttpAsyncHandler を使って適切に処理することはできないのでしょうか? ASP.Net はリクエストを受信し、ThreadPool を使用してハンドラー (BeginProcessRequest) を実行し、その中でコールバックでファイル/データベースをロードします。その後、そのスレッドは他のリクエストを処理するために解放されるはずです。ファイルの読み込みが終わると、ThreadPoolが再び呼び出され、残りのレスポンスを実行する。 私にとってはそれほど違いはないのですが、なぜスケーラブルでないのでしょうか?

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

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

長い質問でした。ありがとうございます :)

どのように解決するのですか?

まず、Node.jsはマルチスレッドではありません。これは重要なことです。スレッド環境で完璧に動作するプログラムを設計するには、非常に優秀なプログラマでなければなりません。スレッドはただただ大変なのです。

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

第二に、プラットフォーム全体が非同期で実行されるように設計されています。すべての IO インタラクションが非同期である ASP.NET プロジェクトを見たことがありますか?

それから、オープンコネクションごとに1つのスレッドを持っているという事実と全体のスケーリングの問題によるメモリのフットプリントがあります。間違っていたら訂正しますが、ASP.NET で接続ごとに新しいスレッドを作成することをどのように回避するかはわかりません。

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

JavaScriptという言語自体が、非同期コーディングを容易にしています。もしあなたがまだC# 2.0を使用しているなら、非同期の構文は本当に苦痛です。多くの開発者は、もしあなたが Action<>Function<> をあちこちに配置し、コールバックを使用しています。イベント方式で書かれた ASP.NET プロジェクトは、平均的な ASP.NET 開発者が保守できないだけです。

スレッドとコアに関しては。Node.js はシングルスレッドで、複数のノード プロセスを作成することで拡張します。16 コアであれば、node.js サーバーの 16 インスタンスを実行し、その前に 1 つの Node.js ロード バランサーを持つことができます。(必要であれば nginx ロードバランサーも)。

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

<強い その他の利点

Node.jsには、上記以外にも多くの利点があります。上記は、イベントループを処理するNode.jsの方法が、ASP.NETの非同期機能でそれを行うよりも優れている理由だけです。

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

Node.jsのデメリット

難しい。若いから。として 熟練した JavaScriptの開発者として、私はNode.jsでウェブサイトを書くことの難しさに直面しています。それは、その低レベルの性質と私がコントロールできるレベルのためです。多くの柔軟性とパワーは、私のために使われるか、私を吊るし上げるかのどちらかです。

APIは凍結されていません。急速に変化しています。Node.jsが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/