naveでNode.jsのバージョン管理&イベントループ詳説:node.jsでサーバサイドJavaScript開発入門(2)(3/3 ページ)
いま注目の「サーバサイドJavaScript」の実装の本命として話題を集める「Node.js」の概要から実践的な使い方まで解説する連載
イベントループ・モデルの弱点を実験
「server.js」の以下のコメントを外して、Node.jsを再実行してみましょう。
//res.writeHead(200, {'Content-Type':'text/html; charset=utf-8'}); //res.end();
Webブラウザで、「http://127.0.0.1:8192/」を開いても、index.htmlが表示されません。
index.htmlの読み込みが完了する前に、HTTPレスポンスを返してしまったためです。
「res.end()」を呼び出すと、レスポンス生成の完了が、Node.jsに通知されます。その時点で、index.htmlの読み込み完了を待たずにレスポンスをWebブラウザに返してしまいます。そのため、index.htmlの中身は表示されません。
□ タイムアウトが発生
では次に、readFileソッドの「res.end()」をすべてコメントアウトして実行してみましょう。
// httpとfsモジュールを読み込む var http = require('http'), fs = require('fs'); // httpサーバの作成 http.createServer(function(req, res) { console.log("start"); // index.htmlを読み込んで表示 fs.readFile('index.html', function(err, content) { if (err) { throw err; } console.log("response end"); res.writeHead(200, {'Content-Type':'text/html; charset=utf-8'}); // res.end(content); }); console.log("end"); // index.htmlの読み込みを待たずにレスポンスを返す //res.writeHead(200, {'Content-Type':'text/html; charset=utf-8'}); //res.end(); }).listen(8192, '127.0.0.1'); console.log('http://127.0.0.1:8192/');
「res.end()」がないため、Node.jsはレスポンス生成の完了を検知できずブロックし続けます。HTTPレスポンスを返さないため、Webブラウザが応答待ち状態になります。2分くらいすると、タイムアウトが発生します。
□ 応答待ち状態で次々にWebブラウザを開くと
Webブラウザが応答待ち状態で次々にWebブラウザを開くと、どうなるでしょうか?
イベントがどんどんキューにたまっていきますが、イベントハンドラは最初のHTTPレスポンス待ち状態でブロックされてしまいます。
ログを見ても最初のリクエストの「start」「end」「response end」が表示されたまま止まってしまいます。最初のリクエストのタイムアウトが発生すると、次のリクエストの「start」「end」「response end」が表示されます。
□ 処理をブロックしないように注意!
このように、イベントハンドラでブロックしてしまうと、後続のイベントが実行待ち状態になってしまいます。
イベントループ・モデルでプログラムを組む場合、処理をブロックしないよう注意する必要があります。
Webアプリケーションで重たい処理を実行する場合は、いったんレスポンスを返して、バックグラウンドで処理を実行し、終わったら通知するような仕組みで実装することをお勧めします。
Ajax、Comet、WebSocketとの違い
バックグラウンドの処理完了を通知する仕組みとしては、Ajaxで定期的に監視する方法やComet、WebSocketなどを使ったリアルタイムに通知する方法あります。
Node.jsを使うメリットは、まさにこのリアルタイム通信にあると私は思います。次回は、Ajax、Comet、WebSocketを例にしてNode.jsを説明したいと思います。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- パターンとライブラリで作るAjaxおいしいレシピ
Ajax開発においてみなさんはMVCを意識していますか? 本連載では、デザインパターンとライブラリを活用し、MVCで設計する分かりやすいプログラミングの仕方をサンプルを見ながら解説します - Cometに代表されるサーバ・プッシュ技術の復権
安藤幸央のランダウン(38) AjaxとCometを使った双方向通信が人気だ。その基となった技術の歴史・問題点を解説し、 さらに活用できるサーバ/フレームワークを紹介する - Tomcat 6で実現! Ajaxを超える通信技術Comet
Tomcatはどこまで“安全”にできるのか?(3) Web上のチャットアプリなどでAjax以上に広く使われそうな注目の通信技術Comet。Tomcat上で手軽に使う方法を解説 - Node.jsの衝撃とWebSocketが拓く未来
WebSocketで目指せ! リアルタイムWeb(1) 注目の新規格「WebSocket」、登場の背景や基本的な使い方、サービスの例、実装状況などを解説する - 初心者のためのJavaScript入門
JavaScriptで本格的なプログラミングの世界へ。実用的なアプリケーションを作れるようになるまで - 第1回 ようこそJavaScriptの世界へ
- 第2回 イベントで「右クリック禁止」を禁止してみよう
- 第3回 変数とfunctionで、はてなボックス出現!
- 第4回 プログラミングのキホン、if文を使ってみよう!
- 第5回 JavaScriptで繰り返し処理をしてみよう!
- 第6回 配列とオブジェクトでデータをまとめる
- 第7回 JavaScriptでDOMに挑戦