たのしいnode.js

イベントドリブンの世界
ある日のkanpou_さん
12/04の私
• いいネタがない
 – クラウドとはなんだったのか
 – 「伽藍とバザール」「UNIXという考え方」
 – 投資のやりかた
         ・・・ピンとこない

• じゃあネタを借りよう! ⇒ node.js
        node.jsという環境
特にイベントドリブン・非同期I/Oを知ってもらおう!
おもいっきり技術志向です。

残念ながら楽しげなスライドになりませんでした。
node.jsとは?
• サーバーサイドJavaScript環境
  – Ruby, Python, perl   ⇔   (node.js & JavaScript)
• 特長
  – 単一プロセス、単一スレッド
  – イベントドリブン・非同期I/O
  – C10K問題クリア


• 続きはWebで!http://nodejs.org/
何がうれしいのか
• みんな大好き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を活用
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

                             イベント
                            コールバック
イベントドリブンとは
 • 並列プログラミングモデル
   – 内部状態の通知によってプログラムが動く
   – 同時に動いているプログラムは1つ
 手続き型・同期I/O                     イベントドリブ
 ン・非同期I/O

          ファイルを読み込む             ファイルを読み込む


                                            裏方が
  待ってる                  別の作業
                                             仕事

          読み込みおわった              読み込みおわった


読んだファイル               読んだファイル
に対する作業                に対する作業
非同期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);
});
ライブラリ
• Web Framework
  – Express
• Middleware
  – RDB, NoSQL(CouchDB, MongoDB, Redis),
    Memcached, AMQP
• Template Engine
  – ejs, Jade
• Real-Time Web(Comet, WebSocket)
  – socket.io
使用例
• Web GUIを持つTVサーバ
                主な仕事
                1.   チューナから映像が来たら:
                     • UDPでストリーミング
                2.   Webサーバにアクセスされた
                     ら:
                     • Webページを返す
                3.   チャネルを選ばれたら:
                     • 切り替える
使用例
• Web GUIを持つTVサーバ
  従来型(マルチスレッ      イベントドリブン 非同期
       ド)         I/O 暇
  (ストリーミングスレッ            映像がきた
  映像がきた 映像待ち
       ド)
                         ストリーミング
  ストリーミング
         送信中
                    暇
                        WebAPIチャネル変更
  映像くれ
                 チャネル
         映像待ち           Webレスポンス
                  変更
同期ロック,スレッドセー
フ,ワークメモリ・・・
うれしくないこと
1. CPUが早くなるわけじゃない
 – あたりまえ
 – ほとんどがCPU処理のアプリにはあまり意味無し

2. イベントドリブン・非同期I/Oへの慣れ
 – 人間は仕事を直列な手続きとして考えたがる
 – どんなスケーラブル・プログラミングモデルに慣れ
   るか?

3. シングルスレッドなのでマルチコアが使えない
 – ミドルウェアによるクラスタ化
   • (memcacheによる共有メモリ,RedisやRabbitMQによるPub/Sub)

たのしいNode.js

  • 1.
  • 2.
  • 3.
    12/04の私 • いいネタがない –クラウドとはなんだったのか – 「伽藍とバザール」「UNIXという考え方」 – 投資のやりかた ・・・ピンとこない • じゃあネタを借りよう! ⇒ node.js node.jsという環境 特にイベントドリブン・非同期I/Oを知ってもらおう!
  • 4.
  • 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)