Node.js を使用する理由Node.js はいつ使用できますか?

青灯夜游
リリース: 2020-08-31 10:04:55
転載
2607 人が閲覧しました

Node.js を使用する理由Node.js はいつ使用できますか?

JavaScript の開発の増加により多くの変化がもたらされ、今日の Web 開発の様相は完全に変わってきました。数年前には、サーバー上で JavaScript を実行することは想像もできませんでした。

Node.js について詳しく説明する前に、言語とデータ形式 (JSON) を統合する クロススタック JavaScript を使用する利点を理解しておくとよいでしょう。開発者リソースを可能な限り最適な方法で再利用できます。 Node.js をテクノロジー スタックに組み込むことは、重要な利点です。

Node.js は、V8 と呼ばれる Chrome の JavaScript エンジン上に構築された JavaScript ランタイム環境です。 Node.js の作成者である Ryan Dahl が「Gmail などのアプリケーションに触発され」、彼の目標が リアルタイム プッシュ機能 を備えた Web サイトを開発することであったことは注目に値します。 Node.js では、ノンブロッキングのイベント駆動型 I/O を処理する機能を提供します。 [ビデオチュートリアルの推奨: nodejs チュートリアル]

これを一言で要約すると、Node.js は、WebSocket プッシュ テクノロジに基づくリアルタイム Web アプリケーションで威力を発揮します。ステートレスなリクエスト/レスポンス パターンに基づいたステートレス Web アプリケーションを 20 年以上使用してきた結果、ついにリアルタイムの双方向接続が可能な Web アプリケーションが完成しました。これにより、クライアントとサーバーの両方が通信を開始し、自由にデータを交換できるようになります。 。

これは、通信が常にクライアントによって開始される典型的な Web 応答モデルとは大きく異なります。さらに、標準ポート 80 で実行されるオープン Web テクノロジー スタック (HTML、CSS、および JS) にも基づいています。

これを Flash や Java アプレットの形で何年も行ってきたと主張する人もいるかもしれませんが、実際には、これらはクライアントにデータを取得するためのトランスポート プロトコルとして Web を使用する単なるサンドボックス環境でした。さらに、これらは分離して実行され、多くの場合、標準以外のポートで実行されるため、追加の権限が必要になる場合があります。

Node.js は、その強みにより、その独自の利点を利用する多くの有名企業のテクノロジー スタックにおいて重要な役割を果たしています。 Node.js Foundation は、ほぼすべての優れたアイデアをまとめています。企業が Node.js を検討する必要がある理由に関する短い PPT は、Node.js Foundation のケース スタディ ページにあります。 この記事では、これらの利点を活用する方法だけでなく、いくつかの古典的な Web アプリケーション モデルを例として使用しながら、Node.js を使用する

なぜ

についても説明します。 それはどのように機能しますか?

Node.js の主なアイデアは、分散デバイス間で実行されるデータ集約型のリアルタイム プログラムに直面する際に、ノンブロッキングのイベント駆動型 I/O を使用して軽量性と効率性を確保することです。

これは一口に読むものです。

これは、Node.js が、Web 開発の世界を支配しようとしている、すべてを解決する新しいプラットフォームであるということを意味します。

代わりに、これは特定のニーズを満たすプラットフォームです。

これを理解することが絶対に必要です。 CPU を大量に使用する操作には Node.js を使用しないでください。実際、多くの負荷の高いコンピューティングに Node.js を使用すると、その利点がほとんどすべて失われてしまいます。 Node.js が真価を発揮するのは、高速でスケーラブルな Web アプリケーションを構築する場合です。これは、多数の同時接続を高スループットで処理できるため、これは高いスケーラビリティに相当します。 根底にある動作原理は非常に興味深いものです。従来の Web サービス テクノロジは、接続 (リクエスト) ごとに新しいスレッドを生成し、システム メモリを占有し、最終的には利用可能な最大メモリによって制限されますが、Node.js はノンブロッキング I/O 呼び出しを使用してシングル スレッドで実行されるため、数万の同時接続 (イベント ループで維持)。

簡単な計算: 各スレッドに 2 MB のメモリが必要であると仮定すると、8 GB のメモリを備えたシステムで実行すると、理論的には最大 4000 の同時接続が可能になります (Michael Abernethy の記事「Node .js とは何ですか?」からの計算) "、2011 年に IBM developerWorks で公開されました。残念ながら、この記事へのリンクは現在無効になっています)、これにはスレッド間の コンテキスト切り替えのコストは含まれていません。これは、従来の Web サーバー テクノロジで通常扱われるシナリオです。これらすべての問題を回避することで、Node.js は 100 万以上の同時接続 600,000 の同時 WebSocket 接続 のレベルを達成します。

もちろん、Node.js アプリケーションを作成する際の潜在的な落とし穴は、クライアントのリクエスト間で単一のスレッドを共有するという問題です。まず、計算が完了するまで受信リクエストがブロックされるため、負荷の高い計算によりノードの単一スレッドがブロックされ、all クライアントの問題が発生する可能性があります (これについては後で詳しく説明します)。次に、開発者は、Node.js インスタンスの終了 (プログラム クラッシュ) を引き起こす、コア (最上位) Node.js イベント ループまで例外が発生しないように、非常に注意する必要があります。

例外が最上位レベルまで湧き上がるのを避けるための一般的な手法は、(他の環境のようにエラーをスローするのではなく) コールバック パラメーターとして呼び出し元にエラーを渡すことです。一部の未処理の例外が最上位レベルまでバブルした場合でも、Node.js プロセスを監視し、必要な

クラッシュからの回復 を実行するツールがあります (ただし、ユーザー セッションの現在の状態への回復は不可能な場合があります) )、最も一般的には Forever モジュール

npm: ノード パッケージ マネージャー

Node.js について議論するときに絶対に見落としてはいけないことの 1 つは、デフォルトですべてのノードに組み込まれている npm ツールを使用したパッケージ管理のサポートです。 js環境がインストールされます。 npm モジュールの概念は、

Ruby Gems に非常に似ています。これは、バージョンと依存関係を管理し、オンライン リポジトリを通じて簡単にインストールできる再利用可能なコンポーネントのセットです。

パッケージ化されたモジュールの完全なリストは、

npm Web サイト で見つけることができます。または、Node.js とともに自動的にインストールされる npm CLI ツールを使用してアクセスできます。モジュール エコシステムは誰でも利用でき、誰でも独自のモジュールを公開でき、公開されたモジュールは npm リポジトリに表示されます。 npm の概要については、初心者ガイド、およびモジュールの公開に関する npm 公開チュートリアル のセクションを参照してください。

いくつかの便利な npm モジュールは次のとおりです:

  • express - Express.js、Sinatra からインスピレーションを得た Node.js Web 開発フレームワーク、現在人気のデファクトスタンダードほとんどの Node.js アプリケーションの場合。
  • hapi - Web およびサービス アプリケーションを構築するためのモジュール式で非常に使いやすい構成中心のフレームワーク
  • connect —— Connect はNode.js 用の拡張可能な HTTP サーバー フレームワーク。Express の基礎としてミドルウェアと呼ばれる一連の高パフォーマンスの「プラグイン」を提供します。
  • socket.iosockjs – 現在、最も一般的な 2 つの WebSocket サーバー側コンポーネントです。
  • pug (以前の Jade) – Express.js のデフォルト オプションである HAML からインスピレーションを得た、人気のあるテンプレート エンジンの 1 つ。
  • mongodb および mongojs – Node.js で MongoDB オブジェクト データベースの API を提供する MongoDB ラッパー。
  • redis —— Redis クライアント。
  • forever - おそらく、特定のノード スクリプトを継続的に実行するために最も一般的に使用されるユーティリティです。予期しない障害が発生した場合でも、Node.js プロセスを運用状態に保ちます。
  • bluebird —— フル機能の Promises/優れたパフォーマンスを備えた実装
  • moment —— 解析、検証、操作、およびフォーマット用の軽量日付を変換する JavaScript 日付ライブラリ。
リストは増え続けています。誰もが使える便利なパッケージがたくさんあります。

Node.js を使用する必要があるのはどのような場合ですか

オンライン チャット

オンライン チャットは、最も典型的なリアルタイム マルチユーザー アプリケーションであり、Node.js の最良のケースです。軽量です。 、デバイス間で分散して実行される、高トラフィックでデータ集約型 (ただし処理と計算量は少ない) アプリケーション。これはシンプルですが、典​​型的な Node.js プログラムで使用するパラダイムのほとんどをカバーしているため、優れた学習ケースでもあります。

それがどのように機能するかをイメージしてみましょう。

最も単純なシナリオを想定します。当社の Web サイトにはチャット ルームがあり、人々は 1 対多 (実際には全員に対して) でメッセージを交換できます。

サーバー側には、次の 2 つのことを実装する単純な Express.js プログラムがあります: 1) メッセージ ボードとユーザー インターフェイスを提供する GET リクエスト ハンドラー。新しいメッセージ入力を初期化するための「送信」ボタン、および 2) WebSocket クライアントからの新しいメッセージをリッスンするための WebSocket サーバー。

クライアント側では、複数のハンドラーが設定された HTML ページがあります。1 つは「送信」ボタンのクリック イベント用で、入力メッセージを受信して​​ WebSocket に送信し、もう 1 つは used を使用します。新しい受信メッセージをリッスンし、WebSocket クライアントに表示します (つまり、サーバーがクライアントに表示する必要がある他のユーザーから送信されたメッセージ)。

クライアントの 1 つがメッセージを投稿すると、次のことが起こります。

  • ブラウザは、入力フィールド (つまり、メッセージ テキスト) 値を取得し、サーバーに接続されている WebSocket クライアント (Web ページの初期化時に初期化される) を使用して WebSocket メッセージを送信します。
  • WebSocket 接続のサーバー側コンポーネントはメッセージを受信し、ブロードキャストを使用して他のすべてのクライアントに転送します。
  • すべてのクライアントは、Web ページで実行されている WebSockets クライアント コンポーネントを通じて新しいメッセージを受信します。次に、新しいメッセージを追加してページを更新します。

Node.js を使用する理由Node.js はいつ使用できますか?

#これは最も単純な例です。より堅牢なソリューションとして、単純な Redis ベースのキャッシュを使用できます。または、より高度なソリューションでは、メッセージ キューをメッセージ ルートとして使用でき、接続が失われたときやクライアントがオフラインになったときにメッセージを保存するなど、より強力な配信メカニズムを実装できます。ただし、どのような改善を行ったとしても、Node.js は同じ基本原則に基づいて実行されます。つまり、イベントに反応し、多数の同時接続を処理し、ユーザー エクスペリエンスをスムーズに保ちます。

オブジェクト データベース上の API

Node.js は確かにリアルタイム アプリケーションの開発に最適ですが、MongoDB などのオブジェクト データベースからのデータを公開するのにも最適です。 JSON 格納データを使用すると、Node.js は格納データと一貫性のあるオブジェクトをデータ変換せずに適切に操作できます。

たとえば、Rails を使用している場合は、JSON からバイナリ モデルに変換し、それを React.js や Angular.js、あるいは単純な jQuery で使用できるように HTTP 経由で JSON に変換する必要があります。 AJAX 呼び出し。 Node.js を使用すると、REST API 経由でクライアントが使用できるように JSON オブジェクトを直接公開できます。さらに、データベースの読み取りまたは書き込み時に、JSON と他のものとの間の変換について心配する必要はありません (MongoDB を使用している場合)。つまり、クライアント、サーバー、データベースで統一されたデータシリアル化形式を使用すると、複数の変換の問題を回避できます。

キュー入力

大量のデータを同時に受信すると、データベースがボトルネックになる可能性があります。前述したように、Node.js は単独で同時接続を簡単に処理できます。しかし、データベース アクセスはブロック操作であるため (この場合)、問題が発生します。解決策は、データが実際にデータベースに書き込まれる前にクライアントの動作を確認することです。

このアプローチにより、システムは高負荷下でも応答性を維持できます。これは、データが正常に書き込まれたことをクライアントが確認する必要がない場合に特に役立ちます。典型的な例には、ユーザー追跡データのログ記録または書き込み時のバッチ処理、および

結果整合性 (NoSQL の世界でよく使用されます) 即時反映を必要としない許容可能な操作 (Facebook の「いいね!」数の更新など) が含まれます。

データは、ある種のキャッシュまたはメッセージ キュー (RabbitMQ、ZeroMQ など) を介してキューに入れられ、別のバッチ書き込みプロセスを介してデータベースに渡されるか、計算集約型のバックエンド サービスによってダイジェストされて、より適切な A に書き込まれます。このようなタスクを実行できるプラットフォーム。同様の動作は他の言語やフレームワークでも実装できますが、同じ高スループットを維持するには同じハードウェア上では実装できません。

Node.js を使用する理由Node.js はいつ使用できますか?

つまり、Node を使用すると、データベースへの書き込みを 1 か所に書き込み、後で正常に処理されたかのように処理することができます。

データ フロー

より従来の Web プラットフォームでは、HTTP リクエストとレスポンスは実際にはストリームですが、独立したイベントとして見なされます。 Node.js でこのプロパティを使用して、優れた機能を構築できます。たとえば、ファイルのアップロードと処理を同時に行うことができ、データはストリームを通じて受信されるため、リアルタイムで処理できます。これは、リアルタイムのオーディオおよびビデオのエンコードに使用できるだけでなく、異なるデータ ソース間のプロキシにも使用できます (次のセクションを参照)。

プロキシ

Node.js をサーバー側プロキシとして使用するのは簡単で、非ブロッキングな方法で多数の同時接続を処理できます。これは、応答時間が異なる複数のサービスのプロキシや、複数のソースからデータが収集されるシナリオに特に役立ちます。

たとえば、次のシナリオ: サーバー側プログラムがサードパーティのリソースと通信するとき、さまざまなソースからデータを抽出するか、画像やビデオなどのリソースをサードパーティのクラウド サービスに保存します。

専用のプロキシ サーバーはありますが、基盤となるプロキシ インフラストラクチャがない場合、またはローカル開発環境が必要な場合は、Node が役立つ場合があります。

株式トレーダーのデータ インターフェイス

アプリケーションに戻りましょう。リアルタイム Web ソリューションに簡単に置き換えることができるもう 1 つの例は、株価の追跡、計算、テクニカル分析、チャートの作成に使用される証券会社の取引ソフトウェアです。

ブローカーは、ライブの Web ベースのソリューションに切り替えると、ワークステーションや職場を簡単に切り替えることができます。間もなく、フロリダのビーチでそれらを見かけるようになるかもしれません...

アプリケーション監視ダッシュボード

Node-with-web -socket が最適なもう 1 つの一般的な使用例は、Web サイト訪問者の追跡と実際の情報の提供です。 - 相互作用の時間視覚化。ユーザーからリアルタイムで統計を収集したり、コミュニケーション チャネルを開いて、目標到達プロセスの特定のポイントで訪問者と的を絞った対話を行うこともできます。これは、CANDDi で確認できます。

訪問者が何をしているかをリアルタイムで理解できたら、ビジネスをどのように改善できるでしょうか? Node.js のリアルタイム双方向ソケットを使用してこれを行うことができるようになりました。

システム監視ダッシュボード

インフラストラクチャの観点から言えば、たとえば、サービス監視ページをユーザーに提供したいと考えている SaaS プロバイダー (GitHub Status Page など)。 Node.js イベント ループを使用すると、サービスのステータスを非同期的にチェックし、WebSocket を使用してデータをクライアントにプッシュする強力な Web ベースのダッシュボードを作成できます。このテクノロジーを使用すると、企業内と公共サービスの両方の状況をリアルタイムで報告できます。

注: Node.js でハード リアルタイム システム (つまり、一貫した応答時間を必要とするシステム) を構築しようとしないでください。この種のアプリケーションの場合は、Erlang の方が良い選択かもしれません

Node.js はどこで使用できますか

#サーバーサイド Web アプリケーション

Node.js と Express.js を使用すると、サーバーサイドで従来の Web アプリケーションを作成することもできます。このアプローチには支持者と反対者がいます。考慮すべき問題がいくつかあります:

利点:

    プログラムに CPU を大量に使用する計算が含まれていない場合は、JavaScript と MongoDB などのオブジェクト ストレージ データベースを使用してプログラムを構築できます。 , データベースレベルで構築することも可能です。これにより、開発作業が大幅に簡素化されます。
  • クローラーは完全にレンダリングされた HTML 応答を受信します。これは、Node.js で実行される単一ページ アプリケーションや WebSocket アプリケーションよりも SEO に優れています。
欠点:

    CPU を大量に使用する計算では Node.js の応答が妨げられるため、スレッド プラットフォームの方が良いアプローチです。
  • リレーショナル データベースで Node.js を使用するのは依然として非常に困難です (詳細は以下を参照)。リレーショナル データベースを使用している場合は、Rails、Django、ASP.Net MVC などの別の環境を選択してください。

CPU 集中型のコンピューティングに代わる方法は、バックエンド処理機能を備えたスケーラブルな MQ 対応環境を作成し、Node をフロントエンドの「スタッフ」にし、クライアントのリクエストを処理することです。非同期的に。

Node.js を使用しない場合

リレーショナル データベースを使用したサーバー側 Web アプリケーション

たとえば、Node.js Express.js と Ruby on Rails を組み合わせる場合、リレーショナル データ アクセスに関しては、後者の方が明らかに適切です。

競合他社と比較すると、Node.js のリレーショナル データベース ツールはまだ非常に原始的です。一方、Rails は、他の Gem に加えて、すぐに使用できるデータ アクセス セットアップおよびデータベース スキーマ移行サポート ツールを提供します。 Rails や同様のフレームワークには、成熟して実績のある Active Record または Data Mapper データ アクセス レイヤー実装があり、これらの機能を純粋な JavaScript で複製したい場合は、頑張ってください。運。

ただし、本当にすべてを JS で実装したい場合は、SequelizeNode ORM2 をチェックしてください。

Rails バックエンドを使用してリレーショナル データベースにアクセスしながら、公開インターフェイスとして Node.js を使用しているだけの場合、これは問題なく、珍しいことではありません。

サーバー側での重い計算と処理

重い計算に関しては、Node.js は最適なプラットフォームではありません。 フィボナッチ計算サーバーを構築するために Node.js を使用することは絶対に避けるべきです。通常、CPU を集中的に使用する操作は、スレッドが数値処理によって占有されている間は受信リクエストがブロックされるため、イベント駆動型のノンブロッキング I/O モデルを通じてノードによって提供されるスループットの利点を無効にします。

前述したように、Node.js はシングルスレッドであり、CPU コアを 1 つだけ使用します。マルチコア サーバーに同時実行性を追加する場合、Node コア チームは クラスター モジュール の形式でいくつかの作業を行いました。 リバース プロキシ nginx の背後で複数の Node.js サーバー インスタンスを簡単に実行することもできます。

クラスターを使用している場合は、すべての重い計算をより適切な環境で作成されたバックグラウンド プロセスに配置し、RabbitMQ などのメッセージ キュー サーバーを介して通信させる必要があります。

このアプローチでは、最初はすべてのバックグラウンド処理が同じサーバー上で実行される場合でも、非常に高いスケーラビリティを実現できる可能性があります。これらのバックグラウンド処理サービスは、フロントエンド Web サーバーの負荷を構成することなく、個別のワーカー サーバーに簡単に分散できます。

もちろん、他のプラットフォームでも同じアプローチを使用できますが、Node.js では、各リクエストが非常に高速で効率的な小さなタスクであるため、前述した高いリクエスト/秒のスループットが得られます。

結論

Node.js について、理論から実践まで、その目標と野望から始めて、その最良の点と落とし穴で終わるまで議論しました。 Node で問題が発生した場合、ほとんどの場合、諸悪の根源はブロック操作にあります。その 99% は Node の誤用が直接の原因です。 覚えておいてください: コンピューティング スケーリングの問題を解決するために Node.js を使用しないでください。これは I/O スケーリングの問題を解決するように設計されており、

非常にうまく機能しました。 したがって、アプリケーションに CPU を集中的に使用する操作が含まれておらず、ブロッキング リソースにアクセスしない場合は、Node.js を活用して、高速でスケーラブルなネットワーク アプリケーションを活用できます。

元の英語アドレス: https://medium.com/the-node-js-collection/why-the-hell-would-you-use-node-js-4b053b94ab8e

【ビデオチュートリアルの推奨:

nodejs ビデオチュートリアル

以上がNode.js を使用する理由Node.js はいつ使用できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:segmentfault.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート