導入
ノードのことを聞いたことがある場合、またはノードがどれほど優れているかを主張する記事を読んだら、「ノードとは何ですか?」と考えているかもしれません。誰にとってもそうではありませんが、ノードは一部の人々にとって正しい選択かもしれません。
node.jsとは何かを説明するために、この記事では、解決できる問題、動作方法、単純なアプリケーションの実行方法、最後にノードがいつ、いつ良い解決策ではないかを調査します。この記事では、複雑なノードアプリケーションの書き込み方法についても包括的なノードチュートリアルではありません。この記事を読むと、ビジネスに使用するためにノードを学習する必要があるかどうかを決定するのに役立ちます。
解決するように設計されたノードは何ですか?
ノードの公に主張されている目標は、「スケーラブルなネットワークプログラムを構築する簡単な方法を提供すること」です。現在のサーバープログラムの問題は何ですか?数学の問題をしましょう。 Java™やPHPなどの言語では、各接続には新しいスレッドが生成され、新しいスレッドごとに2 MBのコンパニオンメモリが必要になる場合があります。 8 GBのRAMを備えたシステムでは、同時接続の理論的最大数は4,000人のユーザーです。クライアントベースが成長するにつれて、Webアプリケーションがより多くのユーザーをサポートする必要があるため、より多くのサーバーを追加する必要があります。もちろん、これにより事業コスト、特にサーバーコスト、送料、人件費が増加します。これらのコストの増加に加えて、技術的な問題があります。ユーザーは各リクエストに対して異なるサーバーを使用する場合があるため、すべてのサーバー間で共有リソースを共有する必要があります。たとえば、Javaでは、各サーバーのJVM間で静的変数とキャッシュを共有する必要があります。これは、Webアプリケーションアーキテクチャ全体のボトルネックです。サーバーが処理できる同時接続の最大数。
この問題に対するノードの解決策は、接続の接続方法をサーバーに変更することです。各接続は、各接続の新しいOSスレッドを生成する(およびコンパニオンメモリを割り当てる)、コンパニオンメモリブロックを必要としないプロセスを作成します。 Nodeは、ロックがまったく許可されておらず、直接I/Oコールをブロックしないため、デッドロックではないと主張しています。ノードはまた、それを実行しているサーバーが数万の同時接続をサポートできると主張しています。実際、ノードは、システム全体のボトルネックを最大数の接続数から単一のシステムのトラフィックに変更することにより、サーバーの対面を変更します。
何万もの同時接続を処理できるプログラムができたので、実際にノードで何を構築できますか?非常に多くの接続を処理する必要があるWebアプリケーションがある場合、それは「恐ろしい」ものです!それは「この問題がある場合、まったく問題ではありません」です。上記の質問に答える前に、ノードがどのように機能するか、どのように機能するかを見てみましょう。
ノードは間違いなくそうではありません
はい、ノードはサーバープログラムです。しかし、それは確かにApacheやTomcatのようには見えません。これらのサーバーは、アプリケーションをすぐにインストールして展開できるスタンドアロンサーバー製品です。これらの製品を使用すると、サーバーを1分で稼働させることができます。ノードは確かにこの種の製品ではありません。 ApacheはPHPモジュールを追加して開発者が動的なWebページを作成できるようにし、Tomcatを使用してプログラマーはJSPを展開して動的なWebページを作成できます。ノードは確かにこのタイプではありません。
ノードの初期段階(現在はバージョン0.4.6)では、「実行可能な」サーバープログラムではなく、インストールしたり、ファイルを配置したり、完全に機能するWebサーバーを持ったりすることはできません。 Webサーバーの基本的な機能を実装したい場合でも、インストールが完了した後に実行されている場合でも、多くの作業が必要です。
ノードの仕組み
ノード自体はV8 JavaScriptを実行します。待って、サーバー上のJavaScript?そうです、あなたはそれを正しく読みます。サーバーサイドJavaScriptは、DeveloperWorksでAptana Jaxer製品について議論するときに約2年前に言及された比較的新しい概念です(リソースを参照)。 Jaxerは決して人気がありませんでしたが、コンセプト自体は手の届かないところにありません。サーバー上のクライアントで使用されるプログラミング言語を使用できないのはなぜですか?
何がV8を作るのですか? V8 JavaScriptエンジンは、GoogleがChromeブラウザーに使用する基礎となるJavaScriptエンジンです。 JavaScriptが実際にクライアントに何をしているのかを考える人はほとんどいませんか?実際、JavaScriptエンジンはコードの解釈と実行を担当しています。 v8を使用して、Googleは別のユニークな機能を備えたC ++で書かれた超高速インタープリターを作成しました。エンジンをダウンロードして、任意のアプリケーションに埋め込むことができます。 1つのブラウザでの実行に限定されません。そのため、Nodeは実際にGoogleが作成したV8 JavaScriptエンジンを使用し、サーバーで使用するために再構築します。完璧すぎる!利用可能な良いソリューションがあるので、なぜ新しい言語を作成するのですか?
イベント駆動型プログラミング
多くのプログラマーは、オブジェクト指向のプログラミングは完璧なプログラミングデザインであり、他のプログラミング方法を否定していると信じるように彼らを教育してきました。ノードは、いわゆるイベント駆動型プログラミングモデルを使用します。
リスト1。クライアントにjQueryを使用したイベント駆動型プログラミング
コードコピーは次のとおりです。
//イベント駆動型のプログラミングがどのように機能するかを示すクライアント側のjQueryコード
//ボタンが押されたら、イベントが発生します - それに対処します
//ここに匿名関数の直接
//必要な変数が存在し、直接参照できます
$( "#mybutton")。クリック(function(){
if($( "#mytextfield")。val()!= $(this).val())
alert( "フィールドはボタンテキストに一致する必要があります");
});
実際、サーバーとクライアントの間に違いはありません。はい、ボタンクリック操作はありません。また、テキストフィールドに入力するアクションもありませんが、より高いレベルでは、イベントが発生しています。接続が確立されます - イベント!データは接続 - イベントを通じて受信されます!データは接続を介して停止します - イベント!
この設定タイプがノードに理想的なのはなぜですか? JavaScriptは、匿名の機能と閉鎖を可能にするため、イベント主導の優れたプログラミング言語です。さらに重要なことに、コードを書いた人は誰でもその構文に精通しています。イベントが発生したときに呼び出されるコールバック関数は、キャプチャイベントで記述できます。このようにして、コードは、複雑なオブジェクト指向のフレームワークなしで、インターフェイスなしで、その上に何かを構成する可能性がないことを簡単に書き込み、維持できます。イベントを聞いて、コールバック関数を書いてから、イベント駆動型のプログラミングがすべての世話をします!
サンプルノードアプリケーション
最後に、いくつかのコードを見てみましょう!議論したすべてを組み合わせて、最初のノードアプリケーションを作成しましょう。ノードはトラフィックの高アプリケーションを処理するのに理想的であることがすでにわかっているため、非常にシンプルなWebアプリケーション、つまり最大速度で構築されたアプリケーションを作成します。 「Boss」で説明されているサンプルアプリケーションの特定の要件を以下に示します。乱数ジェネレーターRestful APIを作成します。このアプリケーションは、入力を受け入れる必要があります。「番号」という名前のパラメーター。次に、アプリケーションは0からパラメーターの間の乱数を返し、生成された数を発信者に返します。 「Boss」は、広く人気のあるアプリケーションであることを望んでいるため、50,000人の同時ユーザーを処理できるはずです。コードを見てみましょう:
リスト2。ノード乱数ジェネレーター
コードコピーは次のとおりです。
//これらのモジュールを使用するためにインポートする必要があります。
//ノードにはいくつかのモジュールがあります。彼らは他の#includeに似ています
//または他の言語でステートメントをインポートします
var http = require( "http");
var url = require( "url");
//任意のノードファイルの最も重要な行。この関数
//サーバーを作成する実際のプロセスを実行します。技術的に、
//ノードは、基礎となるオペレーティングシステムに、
//接続が行われ、この特定のコールバック関数は
//実行されました。 REST APIを使用してWebサービスを作成しているため、
// HTTP変数が必要なHTTPサーバーが必要です
//上記の行で作成しました。
//最後に、コールバックメソッドが「リクエスト」を受信することがわかります
//自動的に「応答」オブジェクト。これは馴染みがあるはずです
// PHPまたはJavaプログラマーへ。
http.createserver(function(request、response){
//応答はすべてのヘッダーと返品コードを処理する必要があります
//これらのタイプのものはサーバープログラムで自動的に処理されます
// apacheやtomcatのように、しかしノードはすべてを自分で行う必要があります
Response.writehead(200、{"content-type": "text/plain"});
//ここにいくつかのユニークなコードがあります。これがノードが撤回する方法です
//クライアントリクエストから渡されたパラメーター。 URLモジュール
//これらすべての機能を処理します。解析機能
// URLを分解し、クエリキーの値をに配置します
//クエリオブジェクト。 「番号」キーの値を見つけることができます
//それを直接参照することにより - javascriptの美しさ。
var params = url.parse(request.url、true).query;
var input = params.number;
//これらは作成する一般的なJavaScriptメソッドです
//発信者に渡される乱数
var numinput = new Number(input);
var numoutput = new Number(math.random() * numinput).tofixed(0);
//乱数を応答して書き込みます
Response.write(numoutput);
//ノードは、この接続を明示的に終了する必要があります。これは
//ノードを使用すると、接続を開いたままにしてデータをやり取りできます。
//この高度なトピックはこの記事では説明していません。
Response.End();
//サーバーを作成するとき、HTTPサーバーを明示的に接続する必要があります
//ポート。標準のHTTPポートは80なので、それをそれに接続します。
})。聞きます(80);
//サーバーが起動したら、文字列をコンソールに出力し、すべてを知らせます
//正しく起動します
console.log( "乱数ジェネレーターの実行...");
上記のコードを「random.js」というファイルに入れます。次に、アプリケーションを起動して実行します(次にHTTPサーバーを作成し、ポート80で接続をリッスンします)、コマンドプロンプトに次のコマンドを入力してください:%node random.js。サーバーが既に稼働しているときの様子は次のとおりです。
コードコピーは次のとおりです。
root@ubuntu:/home/moila/ws/mike#node random.js
乱数ジェネレーターが実行されています...
アプリケーションにアクセスします
アプリケーションは稼働しています。ノードは、接続を聞いています。テストしましょう。 Simple Restful APIを作成したため、Webブラウザーを使用してこのアプリケーションにアクセスできます。次のアドレスを入力します(上記の手順を完了してください):http:// localhost/?number = 27。
ブラウザウィンドウは0〜27の間の乱数に変更されます。ブラウザのリロードボタンをクリックすると、別の乱数が表示されます。それだけです、これはあなたの最初のノードアプリです!
ノードは何に適していますか?
これまでのところ、「ノードとは何か」という質問に答えることができるはずですが、いつ使用すべきかは明確ではないかもしれません。ノードはいくつかのことに適しているため、これは重要な質問ですが、逆に、ノードは現時点では他の人にとって良い解決策ではないかもしれません。間違った状況でそれを使用すると、エンコードされたロットが冗長になる可能性があるため、いつノードを使用するかを決定するように注意する必要があります。
何のために良いの?
前に見たように、ノードはトラフィックが高いと予想される状況に最適であり、クライアントに応答する前にサーバー側のロジックと処理要件は必ずしも大きなものではありません。ノードの優れたパフォーマンスの典型的な例は次のとおりです。
1.レストフルAPI
RESTFUL APIを提供するWebサービスは、いくつかのパラメーターを受信し、それらを解析し、応答を組み合わせ、ユーザーに応答(通常はテキストが少ない)を返します。これは、数万の接続を処理するために構築できるため、ノードにとって理想的な状況です。まだ多くのロジックは必要ありません。データベースからいくつかの値を調べて、応答を組み合わせます。応答は少量のテキストとインバウンドリクエストの少量のテキストであるため、トラフィックは高くなく、マシンは最も忙しい企業のAPIニーズさえも処理できます。
2.Twitterキュー
Twitterのような会社を想像してください。ツイートを受け取ってデータベースに書き込む必要があります。実際、ほぼ何千ものツイートに1秒あたりに達しており、データベースがピーク期間に必要な書き込みの数をタイムリーに処理することは不可能です。ノードは、この問題の解決策の重要な部分になりました。ご覧のとおり、ノードは数万のインバウンドツイートを処理できます。他の別のプロセスがデータベースに書き込むことができるメモリキューメカニズム(たとえば、memcached)に迅速かつ簡単に書き込みます。ここでのノードの役割は、ツイートをすばやく収集し、この情報を書く責任のある別のプロセスに渡すことです。別のデザインを想像してください - 通常のPHPサーバーがデータベース自体への書き込みを処理しようとします - データベース呼び出しがチャンネルをブロックしているため、データベースへの書き込み時に各ツイートが短時間遅れます。データベースの遅延により、このように設計されたマシンは、2000秒のインバウンドツイートのみを1秒のみ処理できます。 1秒あたり100万回のツイートには、500のサーバーが必要です。代わりに、ノードはチャンネルをブロックせずにすべての接続を処理し、できるだけ多くのツイートをキャプチャします。 50,000のツイートを処理できるノードマシンには、20のサーバーのみが必要です。
3。画像ファイルサーバー
FacebookやFlickrなどの大規模な分散ウェブサイトを持つ会社は、サービス画像にのみすべてのマシンを使用することを決定する場合があります。ノードは、この問題の良い解決策になります。会社はそれを使用してシンプルなファイルレトリバーを書き込み、数万の接続を処理できるからです。ノードは画像ファイルを探し、ファイルまたは404エラーを返してから何もしません。このセットアップにより、このような分散Webサイトは、画像、.JS、.CSSファイルなどの静的ファイルを提供するために必要なサーバーの数を減らすことができます。
何が悪いの?
もちろん、場合によっては、ノードは理想的ではありません。ノードが得意でない領域は次のとおりです。
1.動的に作成されたページ
現在、ノードは動的ページを作成するデフォルトの方法を提供していません。たとえば、JavaServerページ(JSP)テクノロジーを使用する場合、このようなJSPコードスニペットにループを含むindex.jspページを作成できます。ノードは、このような動的なHTML駆動型ページをサポートしていません。同様に、ノードはApacheやTomcatのようなWebサーバーとしてあまり適していません。したがって、このようなサーバー側のソリューションをノードで提供する場合は、ソリューション全体を自分で記述する必要があります。 PHPプログラマーは、Webアプリケーションを展開するたびにApache用のPHPコンバーターを書きたくありません。これまでのところ、これはまさにノードが求めていることです。
2。リレーショナルデータベース重いアプリケーション
ノードの目的は高速で、非同期、非ブロッキングです。データベースは、必ずしもこれらの目標を共有するわけではありません。読み取りと書き込み中にデータベースを呼び出すと、結果が生成されるまでチャネルがブロックされるため、同期してブロックしています。したがって、リレーショナルデータベース自体がノードの多くの利点をオフセットできるため、多くのデータベース呼び出し、多くの読み取り、リクエストごとの多くの書き込みが非常に不適切なWebアプリケーションです。 (新しいNOSQLデータベースはノードに適していますが、それはまったく別のトピックです。)
結論
問題は「node.jsとは?」です。答えられるべきでした。この記事を読んだ後、いくつかの明確で簡潔な文章でこの質問に答えることができるはずです。もしそうなら、あなたは多くのコーダーとプログラマーの最前線に来ました。私は多くの人とノードについて話しましたが、彼らは正確なノードとは何かについて混乱しています。当然のことながら、彼らはApacheの考え方を持っています - サーバーはHTMLファイルをITに入れるアプリケーションであり、すべてが適切に機能します。ノードは目的駆動型です。 JavaScriptを使用して、プログラマーが高速でスケーラブルなWebサーバーを簡単かつ迅速に作成できるようにするソフトウェアプログラムです。 Apacheは実行する準備ができていますが、ノードは実行する準備ができています。
ノードは、非常にスケーラブルなサーバーを提供するという目標を達成します。 「接続ごとに1つのスレッド」モデルを割り当てる代わりに、「接続ごとに1つのプロセス」モデルを使用して、各接続に必要なメモリのみを作成します。 Google:V8 Engineの非常に高速なJavaScriptエンジンを使用しています。イベント駆動型のデザインを使用して、コードを最小限で読みやすくします。これらの要因はすべて、ノードの理想的な目標に貢献しています。非常にスケーラブルなソリューションを作成する方が簡単です。
ノードが何であるかを理解するのと同じくらい重要であり、そうでないものを理解してください。ノードは、PHP Webアプリケーションをよりスケーラブルにするように設計されているApacheの代替品ではありません。これは確かにそうです。ノードのこの初期段階では、多数のプログラマーがそれを使用する可能性は低いですが、それが機能するシナリオでは非常にうまく機能します。
将来のノードに何を期待すべきですか?これはおそらく、この記事がもたらす最も重要な質問です。あなたは今それが何をしているのかを知っているので、あなたはそれが次に何をするか疑問に思うべきです。翌年、私は既存のサードパーティサポートライブラリとのより良い統合を提供するノードを楽しみにしています。多くのサードパーティプログラマーは、ファイルサーバーサポートやMySQLサポートの追加など、ノード用のプラグインを開発しました。うまくいけば、ノードがそれらをコア機能に統合し始めます。最後に、HTMLファイルでPHPとJSP(おそらくNSP、ノードサーバーページ)で行うことを行うことができるように、ノードに何らかの動的ページモジュールをサポートする必要があります。最後に、いつか「展開対応」ノードサーバーが表示されます。これは、ApacheやTomcatを使用するのと同じように、ダウンロードしてインストールできます。ノードはまだ初期段階にありますが、非常に迅速に発展しており、すぐにあなたのビジョンにある可能性があります。