bp study39 nodejs
DESCRIPTION
node.jTRANSCRIPT
2010/11/30
id: yssk22 (CouchDB-JP)
自己紹介
Yohei Sasaki (@yssk22)
CouchDB Fan
○ 今年はCouchDB なにもやってないorz
○ 12/12 に MongoDB / CouchDB 勉強会します.
気がついたら node.js ユーザーに.
ハンズオン資料はこちら.
○ http://bit.ly/a7Mm5i
今日の話
「触るのはちょっと面倒だけど、気になってるんだよ」ぐらいの人が対象です。
触るのはちょっと↓
触ってみたくなった↓
ハンズオン資料↓
本!?
イマココ
目標
node.js とは何か.
Google V8
つまりJavaScript
Evented I/O non-blocking I/O
フレームワーク化したもの あるいは ミドルウェア
JavaScript 自体の言語仕様には手を加えてません.
Hello World
hello.js
http://dl.dropbox.com/u/219436/node.js/bpst
udy39/demo/hello.js
Hello World
hello.js
JavaScript
仕様はGoogle V8に準拠
ECMA-262 3rd Edition + 5th Edの一部
V8 2.5.X
○ https://github.com/ry/node/commits/master/de
ps/v8
CommonJS
JavaScript の標準化の一環 モジュール
ユニットテスト
パッケージ
....
この辺の標準に従っておくと、CouchDB とか Rhino とか v8cgi とかでも使えるJavaScriptになる
対応
対応
CommonJS Module
ブラウザJSの場合
<script type="text/javascript"
src="hellolib.js"></script>
<script>
hello();
</script>
CommonJS Module
node.js (CommonJS) の場合
hellolib.js
○ http://dl.dropbox.com/u/219436/node.js/bpstud
y39/demo/hellolib.js
つまりJavaScript
サーバーサイドもJavaScriptでいいじゃない.
v8 ならそれなりに速いし
フロントエンドエンジニアリングの将来Tantek Çelik
イエス。JavaScriptは勝ったんです、議論の余地がありますか?
Douglas Crockford
あらゆる期待に反して、JavaScriptは世界
でもっとも重要なプログラミング言語になりました。誰も望んでも期待もしていなかったけれど、そうなったんです。(笑)
http://www.publickey1.jp/blog/10/yahoo_1.html
JavaScriptの勝利宣言
Ryan Dahl
Nodeにこれだけ人気があるのはサーバでもJavaScriptが使えるためで、それは僕が意図したことでもあります。と同時に、それはサーバサイドを書く手段として望まれていたことでもあったんです。それは大きな断絶だったんです。実はサーバを書くエンジニアはクライアントサイドを書くエンジニアと同じだったのですから。そしてこのシングルスレッド化されたサーバサイドのプログラミングスタイルこそ、サーバを書くのに求められていたものなんです。
http://www.publickey1.jp/blog/10/yahoo_1.html
Why JavaScript?
みんな使ってる
使わざるをえない
そして、プログラミングモデルが実はネットワークプログラム向き.
HTTP Server
httpd.js
http://dl.dropbox.com/u/219436/node.js/bpst
udy39/demo/httpd.js
No More Lock!
httpd2.js
http://dl.dropbox.com/u/219436/node.js/bpst
udy39/demo/httpd2.js
No More Lock!
JavaScript はシングルスレッド
マルチスレッド化しようという動きもあるけれど.
ロックとかとは無縁
シングルスレッド != 並行処理できない
IOを工夫することで解決
IOの単位で処理を実行
Event Loop
I/O
Callback / EventHandler
Functions
event loop
(single thread)
Evented I/O
node.js のAPIは非同期が基本
ランタイム内で以下のライブラリを利用○ libev Event Loop のサポート
○ libeio POSIX API の非同期サポート
JavaScript の書き方はブラウザでやる場合とほとんど同じ Callback
Event Handler
Callback Model
var fs = require('fs');
fs.rename('foo.txt', 'bar.txt',
function(err){
if(err) throw err;
console.log('renamed');
}
);
Event Model
var stdin = process.openStdin();
stdin.on('data', function(chunk){
console.log(chunk);
});
stdin.on('end', function(){
console.log('end');
});
ここまでのまとめ
JavaScript = Google V8
Chrome と同じ
Evented I/O
サーバープログラムの書きやすさ
○ No More Lock!
スレッドを消費しない効率性
JavaScript らしい書き方
つまりJavaScript
サーバーサイドもJavaScriptでいいじゃない.
v8 ならそれなりに速いし
効率的なコードが自然と書ける!
よくある質問を2つほど.
サーバーサイドのJavaScript っていわれても、ライブラリはー?
var php = require('php');
var php = require('php');
php.sprintf('Hello %s', 'World');
基本的な関数はこれで大丈夫!
Ref: phpjs.org
var msg = $('#msg').html();
var jsdom = require('jsdom');
var window =
jsdom.jsdom(content).createWindow();
jsdom.jQueryify(window, __dirname + "/jquery-1.4.2.min.js", function(_, $){
console.log($('#msg').html());});
jQuery が使えるんだ、問題ない.
YUI も使える...というかサーバーサイドYUI. Yahoo User Interface Library ...
npm install hogehoge
node package manager
ライブラリ一覧
○ http://npm.mape.me/
リポジトリはCouchDB
○ curl –X GET http://registry.npmjs.org/_users/
npm install express
Webフレームワーク Express
inspired by Sintra
Webアプリに必要な一通りの機能
npm install oauth
node 用 OAuth Client ライブラリ
Express と併せて使えば、認証はばっちり
npm install nodeunit
node.js 用 xUnit テストフレームワーク
「非同期」とはいえ、単一スレッドのコールバックモデルなので、記述する内容は同じ.
nodeunit テストサンプル
module.exports = testCase({
'test resolveVideoUrl: http://bit.ly/12trpl (shortened URL of TEST_URL)': function(test){
youtube.resolveVideoUrl(
TEST_URL.shortened,
function(err, normUrl, body){
test.ok(!err);
test.equal(normUrl, TEST_URL.url);
test.ok(typeof body == 'string');
test.done();
});
},
非同期メソッド
npm install socket.io
node.js 用 WebSocket ライブラリ
サーバー/クライアント 両方のJavaScriptを提供
○ 両方ともJSだからできる使いやすい実装
WebSocket 非対応ブラウザでもFlashとか使ってよきに計らってくれる
○ ので、負荷さえ気にしなければリアルタイムアプリの実装に使える
で、パフォーマンスは?
やってみよう: retwis-js.
Python Hack-a-thon 2010.11 の時に、redis がおもしろそうだったので node.js
で実装してみた.
https://bitbucket.org/shibu/redis_docjp/o
verview
実験環境
Server: Mac OS X 10.6.5
3.06 GHz * 2 Core 4GB RAM
Client: Ubuntu 10.04
1.80 GHz * 2 Core 8GB RAM
実装差分
node.js版 Python版
nodejs 0.3.0 Python 2.6.4
Express 1.0.0rc4 tornado 1.1
redis 0.3.7 redis 2.0.0
ejs 0.2.1
timeline 表示のab結果(参考値)
0
50
100
150
200
250
5 10 15 20 25 30 50 75 100 125 150 200 250
Req
uest
/ sec
同時接続数 (-c)
node.js
Python
node.js 速い!? Python 遅い!?
python 版 50%しかCPU使用せず... redis へのconnectionを毎回作成している模様 -c 200 で結果が返らなくなった
○ Too many open files.
node.js 版も CPU 100% 使用のみ node プロセスが 99-100%, redis が38%ぐらい.
何も考えなくても1 client のconnectionで正常に動作
○ No more Lock!
-c 250 で Too many open files○ テンプレートファイルを毎回Open/Closeしている
両方ともEvent IOなのでレスポンスが安定
参考値
-n -c # / secTime per Request
(across concurrent)Time per Request
Python node.js Python node.js Python node.js
1000 5 104.81 192.96 9.541 5.182 47.703 25.912
1000 10 107.16 217.58 9.331 4.596 93.315 45.959
1000 15 105.87 224.74 9.446 4.45 141.685 66.744
1000 20 107.06 226.41 9.34 4.417 186,802 88.334
1000 25 106.57 219.57 9.384 4.554 234.588 113.857
1000 30 106.64 221.37 9.377 4.157 281.317 135.522
1000 50 107.45 222.25 9.307 4.628 465.329 231.399
1000 75 102.18 215.6 9.787 4.638 734.033 347.865
1000 100 107.41 206.67 9.31 4.839 930.986 483.862
1000 125 101.31 212.42 9.87 4.708 1233.792 588.456
1000 150 210.4 4.753 712.936
1000 200 209.38 4.776 955.189
1000 250
で、パフォーマンスは?
普通に使えるレベル.
Connection Pooling とか、その手のことは気にしなくてもいける.
ただし、1 CPU しか消費しないので注意.
複数コアの環境では nginx を手前に置いてバランスさせるのが良さそう
○ node.js でもそのうち対応するかも。
node-webworker
つまりJavaScript
サーバーサイドもJavaScriptでいいじゃない.
v8 ならそれなりに速いし
効率的なコードが自然と書ける!
実用的なアプリも書ける!
続きはハンズオンで.