bp study39 nodejs

41
2010/11/30 id: yssk22 (CouchDB-JP)

Upload: yohei-sasaki

Post on 05-Jul-2015

4.254 views

Category:

Technology


0 download

DESCRIPTION

node.j

TRANSCRIPT

Page 1: Bp study39 nodejs

2010/11/30

id: yssk22 (CouchDB-JP)

Page 2: Bp study39 nodejs

自己紹介

Yohei Sasaki (@yssk22)

CouchDB Fan

○ 今年はCouchDB なにもやってないorz

○ 12/12 に MongoDB / CouchDB 勉強会します.

気がついたら node.js ユーザーに.

ハンズオン資料はこちら.

○ http://bit.ly/a7Mm5i

Page 3: Bp study39 nodejs

今日の話

「触るのはちょっと面倒だけど、気になってるんだよ」ぐらいの人が対象です。

触るのはちょっと↓

触ってみたくなった↓

ハンズオン資料↓

本!?

イマココ

目標

Page 4: Bp study39 nodejs

node.js とは何か.

Google V8

つまりJavaScript

Evented I/O non-blocking I/O

フレームワーク化したもの あるいは ミドルウェア

JavaScript 自体の言語仕様には手を加えてません.

Page 5: Bp study39 nodejs

Hello World

hello.js

http://dl.dropbox.com/u/219436/node.js/bpst

udy39/demo/hello.js

Page 6: Bp study39 nodejs

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

Page 7: Bp study39 nodejs

CommonJS

JavaScript の標準化の一環 モジュール

ユニットテスト

パッケージ

....

この辺の標準に従っておくと、CouchDB とか Rhino とか v8cgi とかでも使えるJavaScriptになる

対応

対応

Page 8: Bp study39 nodejs

CommonJS Module

ブラウザJSの場合

<script type="text/javascript"

src="hellolib.js"></script>

<script>

hello();

</script>

Page 9: Bp study39 nodejs

CommonJS Module

node.js (CommonJS) の場合

hellolib.js

○ http://dl.dropbox.com/u/219436/node.js/bpstud

y39/demo/hellolib.js

Page 10: Bp study39 nodejs

つまりJavaScript

サーバーサイドもJavaScriptでいいじゃない.

v8 ならそれなりに速いし

Page 11: Bp study39 nodejs

フロントエンドエンジニアリングの将来Tantek Çelik

イエス。JavaScriptは勝ったんです、議論の余地がありますか?

Douglas Crockford

あらゆる期待に反して、JavaScriptは世界

でもっとも重要なプログラミング言語になりました。誰も望んでも期待もしていなかったけれど、そうなったんです。(笑)

http://www.publickey1.jp/blog/10/yahoo_1.html

Page 12: Bp study39 nodejs

JavaScriptの勝利宣言

Ryan Dahl

Nodeにこれだけ人気があるのはサーバでもJavaScriptが使えるためで、それは僕が意図したことでもあります。と同時に、それはサーバサイドを書く手段として望まれていたことでもあったんです。それは大きな断絶だったんです。実はサーバを書くエンジニアはクライアントサイドを書くエンジニアと同じだったのですから。そしてこのシングルスレッド化されたサーバサイドのプログラミングスタイルこそ、サーバを書くのに求められていたものなんです。

http://www.publickey1.jp/blog/10/yahoo_1.html

Page 13: Bp study39 nodejs

Why JavaScript?

みんな使ってる

使わざるをえない

そして、プログラミングモデルが実はネットワークプログラム向き.

Page 14: Bp study39 nodejs

HTTP Server

httpd.js

http://dl.dropbox.com/u/219436/node.js/bpst

udy39/demo/httpd.js

Page 15: Bp study39 nodejs

No More Lock!

httpd2.js

http://dl.dropbox.com/u/219436/node.js/bpst

udy39/demo/httpd2.js

Page 16: Bp study39 nodejs

No More Lock!

JavaScript はシングルスレッド

マルチスレッド化しようという動きもあるけれど.

ロックとかとは無縁

シングルスレッド != 並行処理できない

IOを工夫することで解決

IOの単位で処理を実行

Page 17: Bp study39 nodejs

Event Loop

I/O

Callback / EventHandler

Functions

event loop

(single thread)

Page 18: Bp study39 nodejs

Evented I/O

node.js のAPIは非同期が基本

ランタイム内で以下のライブラリを利用○ libev Event Loop のサポート

○ libeio POSIX API の非同期サポート

JavaScript の書き方はブラウザでやる場合とほとんど同じ Callback

Event Handler

Page 19: Bp study39 nodejs

Callback Model

var fs = require('fs');

fs.rename('foo.txt', 'bar.txt',

function(err){

if(err) throw err;

console.log('renamed');

}

);

Page 20: Bp study39 nodejs

Event Model

var stdin = process.openStdin();

stdin.on('data', function(chunk){

console.log(chunk);

});

stdin.on('end', function(){

console.log('end');

});

Page 21: Bp study39 nodejs

ここまでのまとめ

JavaScript = Google V8

Chrome と同じ

Evented I/O

サーバープログラムの書きやすさ

○ No More Lock!

スレッドを消費しない効率性

JavaScript らしい書き方

Page 22: Bp study39 nodejs

つまりJavaScript

サーバーサイドもJavaScriptでいいじゃない.

v8 ならそれなりに速いし

効率的なコードが自然と書ける!

Page 23: Bp study39 nodejs

よくある質問を2つほど.

Page 24: Bp study39 nodejs

サーバーサイドのJavaScript っていわれても、ライブラリはー?

Page 25: Bp study39 nodejs

var php = require('php');

var php = require('php');

php.sprintf('Hello %s', 'World');

基本的な関数はこれで大丈夫!

Ref: phpjs.org

Page 26: Bp study39 nodejs

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 ...

Page 27: Bp study39 nodejs

npm install hogehoge

node package manager

ライブラリ一覧

○ http://npm.mape.me/

リポジトリはCouchDB

○ curl –X GET http://registry.npmjs.org/_users/

Page 28: Bp study39 nodejs

npm install express

Webフレームワーク Express

inspired by Sintra

Webアプリに必要な一通りの機能

Page 29: Bp study39 nodejs

npm install oauth

node 用 OAuth Client ライブラリ

Express と併せて使えば、認証はばっちり

Page 30: Bp study39 nodejs

npm install nodeunit

node.js 用 xUnit テストフレームワーク

「非同期」とはいえ、単一スレッドのコールバックモデルなので、記述する内容は同じ.

Page 31: Bp study39 nodejs

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();

});

},

非同期メソッド

Page 32: Bp study39 nodejs

npm install socket.io

node.js 用 WebSocket ライブラリ

サーバー/クライアント 両方のJavaScriptを提供

○ 両方ともJSだからできる使いやすい実装

WebSocket 非対応ブラウザでもFlashとか使ってよきに計らってくれる

○ ので、負荷さえ気にしなければリアルタイムアプリの実装に使える

Page 33: Bp study39 nodejs

で、パフォーマンスは?

Page 34: Bp study39 nodejs

やってみよう: retwis-js.

Python Hack-a-thon 2010.11 の時に、redis がおもしろそうだったので node.js

で実装してみた.

https://bitbucket.org/shibu/redis_docjp/o

verview

Page 35: Bp study39 nodejs

実験環境

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

Page 36: Bp study39 nodejs

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

Page 37: Bp study39 nodejs

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なのでレスポンスが安定

Page 38: Bp study39 nodejs

参考値

-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

Page 39: Bp study39 nodejs

で、パフォーマンスは?

普通に使えるレベル.

Connection Pooling とか、その手のことは気にしなくてもいける.

ただし、1 CPU しか消費しないので注意.

複数コアの環境では nginx を手前に置いてバランスさせるのが良さそう

○ node.js でもそのうち対応するかも。

node-webworker

Page 40: Bp study39 nodejs

つまりJavaScript

サーバーサイドもJavaScriptでいいじゃない.

v8 ならそれなりに速いし

効率的なコードが自然と書ける!

実用的なアプリも書ける!

Page 41: Bp study39 nodejs

続きはハンズオンで.