Node.jsは、多数のチャットルームのチャットルームなど、多数の同時持続的接続を維持するのに優れていることを私は知っています。
私はそれがこれをどのように達成するのか疑問に思っています。とにかく、基盤となるOSによってカプセル化されたTCP / IPを使用しているのですが、なぜ他の人ができないほど持続的接続をうまく処理できるのでしょうか。
それは何の魔法を持っていますか?
Node.jsは、多数のチャットルームのチャットルームなど、多数の同時持続的接続を維持するのに優れていることを私は知っています。
私はそれがこれをどのように達成するのか疑問に思っています。とにかく、基盤となるOSによってカプセル化されたTCP / IPを使用しているのですが、なぜ他の人ができないほど持続的接続をうまく処理できるのでしょうか。
それは何の魔法を持っていますか?
Node.jsは、すべてのI/Oを非同期にします。シングルスレッドでのみ実行されますが、I/Oの待機中に他の要求または操作を実行します。
対照的に、従来のWebサーバーは、前の要求が完全に完了するまで、別の要求を処理しません。このため、Apacheは同時に複数のプロセスを実行します。10個のプロセスがあるとしましょうhttpd
。これは通常、一度に10個のリクエストを処理できることを意味します(*)。プロセスの完了に時間がかかる場合は、データベースが処理してデータを返すのを待つなど、処理するリクエストが少なくなるか、プロセスが何もしていない場合でも、より多くのプロセスを生成する必要があります。
node.jsプロセスは、データベースに送信されるリクエストに直面し、別のリクエストを処理する間、データベースを機能させたままにします。
*)MPMはこれを完全には真実ではありませんが、すべての意図と目的に対して十分に真実です。
実は、ほとんどのWebサーバー(apacheなど)はスレッドスポーンを使用して動作し、着信HTTPリクエストごとに新しいスレッドをスポーンします。これらのスレッドは同期しており、本質的にブロックします=>つまり、記述された順序でコードを実行し、それ以降の計算は現在のI/Oまたは計算タスクによってブロックされます。たとえば、チャットによるチャットの送信のようなイベントをリッスンする場合は、ユーザーごとに専用のスレッドを用意する必要があります(永続的な接続を維持するにはユーザーごとに必要ですが、可能な最適化手法はほとんどありませんが、スレッドはユーザー)このイベントをリッスンすると、このスレッドはこのイベントが発生するのを待ってブロックされます。したがって、スレッドの生成とブロックを行うWebサーバーの場合
一方、Javascriptは本質的に非ブロッキング(非同期コードに伝導性)です=>ここでイベントのコールバックを登録し、それが発生するたびにコールバック関数が実行されます。このイベントを待機している時点ではブロックされません。
これについて詳しくは、ノンブロッキングサーバーまたは非同期サーバーについてお読みください。