私はこの種のことには慣れていませんが、最近、Node.jsがいかに優れているかという話をよく耳にしています。私はjQueryやJavaScriptを扱うのが大好きなので、Node.jsを使うタイミングをどうやって決めたらいいのか悩まずにはいられませんでした。私が考えているWebアプリケーションは、Bitlyのようなもので、コンテンツを取得し、それをアーカイブします。
ここ数日の宿題で、以下のような情報を得ました。Node.js
私が出会ったソースのいくつかを紹介します。
Node.jsはAmazon's EC2インスタンス上でほとんどすぐに実行できることを考えると、PHP、Python、Rubyのような強力な王様とは対照的に、どのようなタイプの問題にNode.jsが必要なのかを理解しようとしています。言語の専門知識に依存することは理解していますが、私の質問はもっと一般的なカテゴリーに属します。特定のフレームワークをどのような場合に使用し、どのような問題に特に適しているのか?
Node.jsの優れた点を見事にまとめていますね。私の感覚では、Node.jsはブラウザからサーバへの持続的な接続を維持したいアプリケーションに特に適していると思います。long-polling"]1と呼ばれる技術を使えば、更新情報をリアルタイムでユーザーに送信するアプリケーションを書くことができます。Ruby on Rails]2やDjangoのような多くのウェブジャイアントでロングポーリングを行うと、アクティブなクライアントが1つのサーバープロセスを消費するため、サーバーに膨大な負荷がかかります。この状況はtarpit攻撃に相当します。Node.jsのようなものを使うと、サーバーは開いている接続ごとに別々のスレッドを維持する必要がありません。
つまり、Node.jsで「ブラウザベースのチャットアプリケーション」5を作れば、システムリソースをほとんど消費せずに多くのクライアントにサービスを提供することができるのです。このような長時間のポーリングを行いたい場合には、Node.jsが最適な選択肢となります。
RubyとPythonにもこの種のツールがありますが(それぞれeventmachineとtwisted)、Node.jsは非常によくできていて、しかも最初から作られています。JavaScriptはコールバックベースのコンカレンシーモデルに非常に適しており、ここでは優れています。また、クライアントとサーバーの両方でJSONをネイティブにシリアライズ/デシリアライズできるのは、とても素晴らしいことです。
他の回答を読むのが楽しみです。
Node.jsは、クライアントとサーバーの間で多くのコードを再利用するような状況にも適しています。Meteorフレームワーク]8はこれをとても簡単にしてくれますし、多くの人がこれがWeb開発の未来になるのではないかと言っています。私の経験から言うと、Meteorでコードを書くのはとても楽しいですし、その大部分は、ブラウザで実行されるコードが簡単にデータを操作したり、データを返したりできるように、データをどのように再構築するかを考える時間を減らすことにあります。
ここにPyramidとlong-pollingに関する記事がありますが、geventの助けを借りればとても簡単に設定できることがわかります。Pyramidを使ったTicTacToeとロングポーリング*です。
Node.jsは、オンラインゲーム、コラボレーションツール、チャットルームなど、ユーザー(またはロボットやセンサー)がアプリケーションで行ったことを、ページを更新することなくすぐに他のユーザーに見せる必要があるような、リアルタイムアプリケーションに最適だと思います。
また、Node.jsとSocket.IOを組み合わせることで、長いポーリングでは不可能だったリアルタイムのレイテンシーをさらに短縮することができることもお伝えしておきます。 Socket.IOは、最悪の場合、ロングポーリングにフォールバックし、代わりにWebソケットや、Flashが利用できる場合はそれを使用します。
しかし、スレッドが原因でコードがブロックされるような状況には、Node.jsを使った方が良いということも言っておきます。 また、アプリケーションをイベントドリブンにする必要がある場合も同様です。
また、以前参加した講演でRyan Dahl氏が、Node.jsのベンチマークは、通常のHTTPリクエストではNginxに匹敵すると言っていました。 つまり、Node.jsで構築すれば、通常のリソースを非常に効率的に提供することができ、イベントドリブンなものが必要になったときには、すぐに対応できるのです。
さらに、常にすべてがJavaScriptです。 スタック全体がリンガフランカです。
簡潔に言うと
Node.jsは、関数の実行中にイベントループ(他のすべてのクライアントと一緒に)がブロックされるため、同時接続数が多く、各リクエストが必要とするCPUサイクルが非常に少ないアプリケーションに適しています。
Node.jsのイベントループに関する良い記事はMixu's tech blog: Understanding the node.js event loopです。