More Related Content Similar to たのしいNode.js (20) More from ishiki-takai (8) たのしいNode.js3. 12/04の私
• いいネタがない
– クラウドとはなんだったのか
– 「伽藍とバザール」「UNIXという考え方」
– 投資のやりかた
・・・ピンとこない
• じゃあネタを借りよう! ⇒ node.js
node.jsという環境
特にイベントドリブン・非同期I/Oを知ってもらおう!
5. node.jsとは?
• サーバーサイドJavaScript環境
– Ruby, Python, perl ⇔ (node.js & JavaScript)
• 特長
– 単一プロセス、単一スレッド
– イベントドリブン・非同期I/O
– C10K問題クリア
• 続きはWebで!http://nodejs.org/
6. 何がうれしいのか
• みんな大好きJavaScript
– Google Chrome V8 JavaScript Engine
• C言語より高速なJavaScriptによるバイナリ操作が話題 « A-
Listers http://tech.a-listers.jp/2012/10/10/faster-than-c/
– YUIも jQueryも
• ネットワークプログラム(含Web)が超ラク
– ソケット処理はライブラリ丸投げ
– イベントドリブン
• (うまく書けば)高パフォーマンス
– 非同期I/O前提の環境: CPU Idleを活用
7. Echo Server
var net = require(‘net’);
var srv = net.createServer(function (sock) {
sock.on(‘data’, function (buf, err) {
sock.write(buf);
});
});
srv.listen(4050); //TCP port 4050
イベント
コールバック
8. イベントドリブンとは
• 並列プログラミングモデル
– 内部状態の通知によってプログラムが動く
– 同時に動いているプログラムは1つ
手続き型・同期I/O イベントドリブ
ン・非同期I/O
ファイルを読み込む ファイルを読み込む
裏方が
待ってる 別の作業
仕事
読み込みおわった 読み込みおわった
読んだファイル 読んだファイル
に対する作業 に対する作業
9. 非同期I/O
var fs = require(‘fs’);
//’/to/a’, ‘/to/b’は同時に読み込まれる
//タイマー等他イベントは読み込みが完了してなくても処理
される
fs.readFile(‘/to/a’, function (err, data) {
//読み込んだ結果を表示
console.log(data);
});
fs.readFile(‘/to/b’, function (err, data) {
//読み込んだ結果を表示
console.log(data);
});
10. ライブラリ
• Web Framework
– Express
• Middleware
– RDB, NoSQL(CouchDB, MongoDB, Redis),
Memcached, AMQP
• Template Engine
– ejs, Jade
• Real-Time Web(Comet, WebSocket)
– socket.io
11. 使用例
• Web GUIを持つTVサーバ
主な仕事
1. チューナから映像が来たら:
• UDPでストリーミング
2. Webサーバにアクセスされた
ら:
• Webページを返す
3. チャネルを選ばれたら:
• 切り替える
12. 使用例
• Web GUIを持つTVサーバ
従来型(マルチスレッ イベントドリブン 非同期
ド) I/O 暇
(ストリーミングスレッ 映像がきた
映像がきた 映像待ち
ド)
ストリーミング
ストリーミング
送信中
暇
WebAPIチャネル変更
映像くれ
チャネル
映像待ち Webレスポンス
変更
同期ロック,スレッドセー
フ,ワークメモリ・・・
13. うれしくないこと
1. CPUが早くなるわけじゃない
– あたりまえ
– ほとんどがCPU処理のアプリにはあまり意味無し
2. イベントドリブン・非同期I/Oへの慣れ
– 人間は仕事を直列な手続きとして考えたがる
– どんなスケーラブル・プログラミングモデルに慣れ
るか?
3. シングルスレッドなのでマルチコアが使えない
– ミドルウェアによるクラスタ化
• (memcacheによる共有メモリ,RedisやRabbitMQによるPub/Sub)