node.js覚書


いろいろ調べたのでメモする

node.js ってなあに?


JavaScriptを用いた Non-blocking I/O な環境

Non-blocking I/O?


CPUと他の入出力装置(I/O)において、データの送受信を待たずに、次の処理に移行する方式のこと。
逆に、入出力が完了するまで待つことを「ブロッキング」と呼ぶ
例えば、こんなのがブロッキング

require 'open-uri'
p "1: #{Time.now}"
open("http://www.ruby-lang.org/") {|f|
  p "2: #{Time.now}"
}
p "3: #{Time.now}"

# output
"1: 2013-03-10 11:58:16 +0900"
"2: 2013-03-10 11:58:19 +0900"
"3: 2013-03-10 11:58:19 +0900"


上記の場合、2の処理が終わるまで、3が実行されない(ブロックされてる)

node.js の場合はどうなるの?


こうなる

var http = require("http");
console.log('1' + new Date());
http.get(
  {
    host : 'www.google.com',
    path : '/'
  }, function(res){
    console.log('2' + new Date());
  }
);
console.log('3' + new Date());

# output
1Sun Mar 10 2013 12:04:00 GMT+0900 (JST)
3Sun Mar 10 2013 12:04:00 GMT+0900 (JST)
2Sun Mar 10 2013 12:04:01 GMT+0900 (JST)


http.get でブロックされずに、先に3の処理が実行されている

ブロックされないのは分かったけど、それだと何がお得なの?


Non-blocking だと、待ちが無いので、結果が帰ってくるまでの間、他の処理が実行できる
つまり、シングルスレッドで複数のリクエストを同時に捌く事が可能になる

それだと何が良いの? ハイスペックなマシンでスレッドたくさん作って富豪的に解決すれば良いんじゃ?


1台のマシンだと大量のスレッドを作成すると、1個1個のスレッドの処理が軽くて、
メモリ的に余裕があっても、大量のスレッドそのものがマシン性能を圧迫する問題がある
→ C10K問題

C10K問題の回答の一つとして、Non-blocking である node.js が作られた

なんで JavaScript なの?


nodeを作るに当たって、実装側でブロックが発生する処理は書けないようにしたかった
他の言語だとファイルシステムへのアクセスとか、ブロックが発生しえる処理が実装出来てしまうけど、
JavaScriptにはそれがなかった(標準入出力の仕様が無い)し、基本的にイベント駆動な書き方しか出来ないので、nodeの思想と相性が良かったから


後、JavaScriptにした副作用として

  • 採用したV8エンジンが早い
  • クライアントサイドと、言語が統一された
  • jQueryとか既存の便利なライブラリが使える

node.js 向けのアプリってどんなの?

  • webAPIみたいな処理は少ないけど、大量のアクセスがあるアプリ
  • いろんなサーバにアクセスして、結果が帰ってくるのを待つ必要がある、クローラー
    • jQueryとか使えるから、DOM操作も楽だよ!
  • webSoketを生かしたリアルタイムコミュニケーション

逆に向かない処理は?

インストール方法は?


こちらを参照

ざっと動かしてみたい


こちらを参照

最後に一言


サーバサイド JavaScript っていうのは結果であって、それが売りじゃないよ!
本当の売りは、Non-blocking I/O だよ! って中の人が言ってた