Node.jsのイベントドリブンはそんなに違うのか?ASP.NetのHttpAsyncHandlerではできないの?
質問
私は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/
関連
-
NET 6の新しい設定オブジェクトConfigurationManagerの紹介
-
ASP.NET学習でよくあるエラーのまとめ
-
[解決済み] Node.js + Nginx - 今度は何?
-
[解決済み] 一般的に、Node.jsは10,000の同時リクエストをどのように処理するのですか?
-
[解決済み] JSONウェブトークンの無効化
-
[解決済み] Server.MapPath("."), Server.MapPath("~"), Server.MapPath(@"\"), Server.MapPath("/"). この違いは何ですか?
-
[解決済み] スレッドは何本までならOK?
-
[解決済み】Node.jsは内部でThreadsに依存しているのに、どうして本質的に高速なのですか?
-
[解決済み] Visual Studio 新しいブラウザを開けない
-
[解決済み] Razor _layout.cshtml のファイル名の先頭にアンダースコアがあるのはなぜですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
NET 6の新しい設定オブジェクトConfigurationManagerの紹介
-
ASP.NET学習でよくあるエラーのまとめ
-
ASP.NET Core MVC Dependency Injection ビューとコントローラ
-
認証プロセスの記録にjwtを使用したネット
-
403 - アクセス拒否。IIS7 でファイルを開くと、アクセス拒否されます。
-
デバッグエラー蓄積
-
[解決済み] crossdomain.xmlファイルとは何ですか?
-
[解決済み] ASP.NET WebサイトとASP.NET Webアプリケーションのどちらを選ぶか?
-
[解決済み] Razorとインラインコードブロックによるif文の使用方法
-
[解決済み] ASP.NET Web APIでのユーザー認証