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 向けのアプリってどんなの?
逆に向かない処理は?
最後に一言
サーバサイド JavaScript っていうのは結果であって、それが売りじゃないよ!
本当の売りは、Non-blocking I/O だよ! って中の人が言ってた
参考
- 10分でわかる Node.js
- 大変わかりやすいプレゼン資料
- Node.jsのコンセプトとは? ライアン・ダール氏による東京Node学園祭 基調講演(前編) − Publickey
- 中の人による講演。目的や、JavaScriptを選んだ理由とか
- node.js とは何か - I am Bad at Math