2012-05-12 8 views
5

Node.jsは、多数のチャットルームのチャットルームなど、多数の同時永続的な接続を維持することができます。nodejs - なぜNode.jsが多数の同時永続接続を処理できるのですか?

これはどのように達成されたのでしょうか。とにかく、根本的なOSによってカプセル化されているTCP/IPを使用しているのですが、なぜ永続的な接続を処理して他の人ができないのでしょうか?

魔法のことは何ですか?

+5

@MartinJames:JSがスクリプトの児童の領域であった時代を去ったと思います。卑猥な言葉遣いの発言は必要ありません。 – Amadan

+0

@Amadan OPの質問はビジネス促進の寸前です。 「現実に直面した問題に基づいて実用的で答えられる質問」(faq)のようには聞こえません。言葉遣いの発言は適切だったようだ。本当の質問である可能性があるので、私はそれをダウンボートしたり、投票に投票したりしませんでした。 –

+0

@MartinJames:いいえ、質問がSOに属していないと感じる場合は、FAQへのポインタが適切であり、そうではありません。質問が[node.cs](https://github.com/Rduerden/Node.cs)に関するものであれば同じ回答をしましたか? – Amadan

答えて

6

Node.jsはすべてのI/Oを非同期にします。これは単一のスレッドでのみ実行されますが、I/Oを待機している間は他の要求や操作を行います。

これとは対照的に、古典的なWebサーバーは、前のWebサーバーが完全に完了するまで、別の要求を処理しません。このため、Apacheは複数のプロセスを同時に実行します。 10個のリクエストが一度に(*)提供されることを意味する10 httpdプロセスがあるとします。プロセスが完了するまでに時間がかかると、要求が少なくなります。つまり、プロセスが何も実行していなくても、データベースが疲れてデータを返すのを待つなど、多くのプロセスを起動する必要があります。

node.jsプロセスは、データベースに行く要求に直面して、データベースが別の要求を処理する間に動作するようにします。

*)MPMはこれを真実ではありませんが、すべての目的や目的に十分に当てはまります。

+1

Node.jsがノンブロッキングIOを使用している場合、Apacheのような他の巨人が非ブロッキングなものを作り出せない理由は非常に興味がありますか?この種のフレームワークに対してhttpdが変更されないのはなぜですか?彼らはできますか? –

+1

セキュリティ。 Apacheはうまくいく。お互いに要求を分離することもその一部です。しかし、リクエストを分離したくないときはいつでも、Apacheはそれをうまく処理しません。 Phusion PassengerとFastCGIが役立ちます。注意:Apacheは主に静的ページを提供します。それ以外はCGIやプラグイン(Apacheモジュール)を経由します。したがって、I/O用のApacheを最適化することは、カートを引き出すためのガチョウを最適化することと同じです。 (一方、RubyやPythonについて言えば、node.jsはそれぞれの非同期ライブラリ(EventMachineまたはTwisted)を通じて同じことをすることができます。 – Amadan

0

さて、ほとんどのWebサーバー(Apacheなど)は、スレッドの起動を使用して動作します。そこでは、すべての着信HTTPリクエストに対して新しいスレッドを実行します。これらのスレッドは同期的であり、性質=>でブロックされます。つまり、書き込まれた順番でコードを実行し、現在のI/Oまたは計算タスクによってさらなる計算がブロックされます。チャッターによるチャットの投稿のようなイベントを聞きたい場合は、ユーザーごとに専用のスレッドが必要です(ユーザーごとに永続的な接続を維持するために必要ですが、最適化のテクニックはほとんどありませんが、このスレッドは、このイベントが発生するのを待ってブロックされます。したがって、Webサーバーの起動とブロックを行うスレッドの場合

JavaScriptは自然に非ブロッキング(および非同期コードへの導通)=>ここでイベントのコールバックを登録し、コールバック関数が発生するたびに実行されます。このイベントを待っている時点ではブロックされません。

これについては、非ブロッキングまたは非同期サーバーについての記事を参照してください。

+0

JavaScriptは非同期ではないため、node.jsは非同期です。 JavaScriptは、関数のファーストクラスの市民権のために、非同期コーディングスタイル(またはむしろ継続継承スタイル)とはむしろ導通しています。 JavaScript自体に特に非同期的なものは何もありません。 – Amadan