解釈が間違っている点がある可能性が御座いますのでご了承くださいませ。記事の内容としては「Node.js なら他のサーバよりもこんなに簡単に WebSocket が扱える(ライブラリがある)」というような内容となっていますので、ご了承いただければと思います。
Node.js って何?
Node.js についてよくわからず最初は以下のページを読んでました。
Node.jsに関する基礎や開発・チュートリアルのまとめ:phpspot開発日誌
例えば、ログイン中の2人がいて、1人がチャットのリクエストをしたとします。でもラグが30秒ほどあって、気付かずに閉じちゃうなんてことがなくなります。
メンバーAのブラウザがメンバーBのブラウザに直接プッシュするってことかと最初は思っていましたが違いました。この点について深く考えていくこととなります。
Node.js を使うと何ができるのか
node.js を使うと普段 XHR でポーリングしてやってることを、コネクション張りっぱなしにしてメッセージを受信したタイミングで全てのコネクションにメッセージを送信することができる。
従来 XMLHttpRequest の場合
つまり今までの XMLHttpRequest では「こんにちはー」「最新ツイートを20件ください」「分かりました」「新しいツイートはありませんでした」「さようならー」というやりとりでこちらから何度も「こんにちはー」の接続をするので回数が増えるとサーバーに負荷がかかる。
Node.js の場合
しかし Node.js を使えば「こんにちはー」「新しいツイートはありませんか?」「新しいツイートはありません」「新しいツイートがあったら教えてください」「わかりました」というような流れでコネクションを維持します。新しいツイートがあればそれがポイッポイッと投げてもらえます。これがプッシュですね。
Node.js でコネクションを維持すると余計に負荷がかかるのでは?
どうやらそうでも無いようです。まず Node.js は WebSocket というものを使っています。
この記事の中で以下の文章に注目します。
サーバとクライアントが一度コネクションを行った後は、必要な通信を全てそのコネクション上で専用のプロトコルを用いて行う
この専用のプロトコルというのがポイントです。XMLHttpRequest をしているわけではないのでとても軽量なんです。大量の負荷にも耐えられるみたい。
軽量な理由はイベントループのおかげですかね。このおかげでサーバーの使用メモリが抑えられて、どかどかアクセス来たときも落ちにくい。
ここまでの Node.js の凄いところをまとめると
- サーバーからクライアントに対してプッシュができる
- 専用のプロトコルでコネクションを維持し続けてくれる
プッシュと言えば Comet というものがある
Comet というものがあるそうなんですが、これについても先ほどの Wikipedia の記事にも書いてあり、ポイントだけを引用させて頂きますと。
Comet ではサーバ側からのプッシュ配信が可能なものの、多くの実装では擬似的に双方向通信を行うため通信が発生するごとに TCP のハンドシェイク手続きを再度行う必要があるほか、HTTP コネクションを長時間占有するためその間同一サーバに接続する他のアプリケーションの動作に影響を及ぼす可能性がある
WebSocket が専用のプロトコルを使っているのとは違って Comet は HTTP コネクションを使ってコネクションを維持していますので Apache のスレッド使いまくりなのでメモリを大量消費するとのことです。
ただ WebSocket などに対応していないブラウザに対応する場合は Node.js にプラグイン的なものを読み込んで Comet を使うことで、そのようなブラウザに対応することが可能だそうです。
Node.js ってそもそも何なのか
Node.js 自体は「サーバーの中で JavaScript を動かそうー」っていう技術で、その上で Socket.IO がいち早く実装されたから「WebSocket といえば Node.js」って認知されてるだけ。
Socket.IO は Node.js のパッケージらしいです。Node.js がただただ凄いんだと思っていましたが、Node.js が WebSocket に一番に対応しているためここまでの注目を集めているんですね。
ちなみに多くのサイトで Node.js の「イベントループ」というキーワードが出てきています。このイベントループという仕組みが WebSocket に向いているそうですよ。
PHP でも WebSocket が使える
Web サーバを WebSocket が使えるものにするか、PHPからApacheとは別に WebSocket 用のサーバを立てるものみたいとのことです。
phpwebsocket – PHP and WebSockets – Google Project Hosting
Node.js じゃなくて実は Node が正式名称
聞いた話だと正式名称は Node だそうですが、皆さんに伝わりやすいように Node.js とさせて頂いております。
コメント