東京node学園#3 domains & isolates
TRANSCRIPT
![Page 1: 東京Node学園#3 Domains & Isolates](https://reader034.vdocuments.net/reader034/viewer/2022052410/5561ed9ad8b42ab1068b54ed/html5/thumbnails/1.jpg)
東京NODE学園 3時限目
DOMAINS ISOLATESDOMAINS & ISOLATES
@koichik
![Page 2: 東京Node学園#3 Domains & Isolates](https://reader034.vdocuments.net/reader034/viewer/2022052410/5561ed9ad8b42ab1068b54ed/html5/thumbnails/2.jpg)
自己紹介
@koichik, id:koichik
JavaScriptとの関わり
1997年頃に仕事でServer-Side JavaScript
Netscape LiveWire, Microsoft IIS
Nodeとの関わり
2010/08から触り始める
APIドキュメント翻訳
node-handlersocket
2011/07から (なぜか) コアチーム入り
ろくに貢献できてないので頑張りますー
![Page 3: 東京Node学園#3 Domains & Isolates](https://reader034.vdocuments.net/reader034/viewer/2022052410/5561ed9ad8b42ab1068b54ed/html5/thumbnails/3.jpg)
Node安定版の歴史
v0.2 (2010/08/20)
v0.4 (2011/02/10)
SSL/TLSのオーバーホール
新しいHTTPクライアントAPI
組み込みデバッガ
v0.6 (2011/11/04)
ネイティブWindowsサポート
クラスタリング
さらに新しいHTTPクライアントAPI
![Page 4: 東京Node学園#3 Domains & Isolates](https://reader034.vdocuments.net/reader034/viewer/2022052410/5561ed9ad8b42ab1068b54ed/html5/thumbnails/4.jpg)
次期安定版
v0.8
2012/01リリース予定
V8のリリースサイクルに合わせて短期間で頻繁なリリースを目指す短期間で頻繁なリリースを目指す
新機能の目玉
Domains
Isolates
![Page 5: 東京Node学園#3 Domains & Isolates](https://reader034.vdocuments.net/reader034/viewer/2022052410/5561ed9ad8b42ab1068b54ed/html5/thumbnails/5.jpg)
担当するのはこの人達
Domains担当@piscisaureus
Isolates担当@bnoordhuis@ry
@isaacs @cramforce
![Page 6: 東京Node学園#3 Domains & Isolates](https://reader034.vdocuments.net/reader034/viewer/2022052410/5561ed9ad8b42ab1068b54ed/html5/thumbnails/6.jpg)
注意
現在絶賛開発中
仕様も実装も激変する可能性大
話半分ということで
![Page 7: 東京Node学園#3 Domains & Isolates](https://reader034.vdocuments.net/reader034/viewer/2022052410/5561ed9ad8b42ab1068b54ed/html5/thumbnails/7.jpg)
Domains
![Page 8: 東京Node学園#3 Domains & Isolates](https://reader034.vdocuments.net/reader034/viewer/2022052410/5561ed9ad8b42ab1068b54ed/html5/thumbnails/8.jpg)
エラーハンドリング
EventEmitterで'error'イベントが発生
リスナがなければ例外がスローされる
例外がイベントループに達する
processで'uncaughtException'イベントが発生
processで'uncaughtException'イベントが発生 リスナがなければスタックトレースを出力してプロセスは終了
http://d.hatena.ne.jp/koichik/20111213
![Page 9: 東京Node学園#3 Domains & Isolates](https://reader034.vdocuments.net/reader034/viewer/2022052410/5561ed9ad8b42ab1068b54ed/html5/thumbnails/9.jpg)
エラー処理の粒度
EventEmitter
細かすぎる
process
大雑把すぎる
![Page 10: 東京Node学園#3 Domains & Isolates](https://reader034.vdocuments.net/reader034/viewer/2022052410/5561ed9ad8b42ab1068b54ed/html5/thumbnails/10.jpg)
そこで
関連するイベントをひとまとめに
それがDomains
適切な粒度でエラーハンドリング可能
Domainsにまとめられるイベント Domainsにまとめられるイベント
対応モジュール (11/12/13時点)
net (tls, http, https)
dns
fs
timers
handleとして抽象化
![Page 11: 東京Node学園#3 Domains & Isolates](https://reader034.vdocuments.net/reader034/viewer/2022052410/5561ed9ad8b42ab1068b54ed/html5/thumbnails/11.jpg)
Domainsの使い方
実装はdomains2ブランチ
masterにはマージされていない
デフォルトはDomains無効
--domainsオプションで有効化
domainsモジュール
var domains = require('domains');
![Page 12: 東京Node学園#3 Domains & Isolates](https://reader034.vdocuments.net/reader034/viewer/2022052410/5561ed9ad8b42ab1068b54ed/html5/thumbnails/12.jpg)
ドメインの作成
domains.createDomain(arg, cb)
新しいドメインを作成して返す
イベントループに戻った後、作成されたドメインでcbが呼び出される作成されたドメインでcbが呼び出される
コンテキストベース
createDomain()の第1引数argがcbに渡される
cb内で行うI/O等は作成されたドメインに関連づけられる
![Page 13: 東京Node学園#3 Domains & Isolates](https://reader034.vdocuments.net/reader034/viewer/2022052410/5561ed9ad8b42ab1068b54ed/html5/thumbnails/13.jpg)
「現在の」ドメイン(デフォルトドメイン)
var req = http.request(...);var myDomain = domains.createDomain(null, function() {
(myDomain)
デフォルトドメインに関連
});setTimeout(function() {...}, 10000);
(myDomain)
var req = http.request(...);setTimeout(function() {...}, 10000);
これらはmyDomainに
関連
デフォルトドメインに関連
![Page 14: 東京Node学園#3 Domains & Isolates](https://reader034.vdocuments.net/reader034/viewer/2022052410/5561ed9ad8b42ab1068b54ed/html5/thumbnails/14.jpg)
ドメインのエラー処理
'error'イベントのリスナを登録する
myDomain.on('error', listener)
ドメインに関連づけられたI/O等で発生したエラーをまとめて処理発生したエラーをまとめて処理
ドメイン内の他のI/Oはキャンセルされる
![Page 15: 東京Node学園#3 Domains & Isolates](https://reader034.vdocuments.net/reader034/viewer/2022052410/5561ed9ad8b42ab1068b54ed/html5/thumbnails/15.jpg)
HTTPサーバでの利用例
http.createServer(function(req, res) {var myDomain =
domains.createDomain(null, function(arg) {... // リクエストを処理... // リクエストを処理
});myDomain.on('error', function(err) {res.writeHead(500);res.end();
});});
![Page 16: 東京Node学園#3 Domains & Isolates](https://reader034.vdocuments.net/reader034/viewer/2022052410/5561ed9ad8b42ab1068b54ed/html5/thumbnails/16.jpg)
エラーハンドリング (v0.8~)
EventEmitterで'error'イベントが発生
リスナがなければ例外がスローされる
例外がイベントループに達する
非デフォルトドメイン実行中ならそのドメインで 非デフォルトドメイン実行中ならそのドメインで'error'イベントが発生
デフォルトドメイン実行中ならprocessで'uncaughtException'イベントが発生
processで'uncaughtException'イベントが発生
リスナがなければスタックトレースを出力してプロセスは終了
![Page 17: 東京Node学園#3 Domains & Isolates](https://reader034.vdocuments.net/reader034/viewer/2022052410/5561ed9ad8b42ab1068b54ed/html5/thumbnails/17.jpg)
domainsのその他API
domains.getCurrent()
現在のドメインを返す
domains.add(handle)
handleを現在のドメインに追加
domains.remove(handle)
handleを現在のドメインから削除
domains.addDefaultDomain(handle)
handleをデフォルトドメインに追加
![Page 18: 東京Node学園#3 Domains & Isolates](https://reader034.vdocuments.net/reader034/viewer/2022052410/5561ed9ad8b42ab1068b54ed/html5/thumbnails/18.jpg)
DomainオブジェクトのAPI
domain.kill()
ドメインに関連づけられたI/O等(handle)を全てキャンセル
![Page 19: 東京Node学園#3 Domains & Isolates](https://reader034.vdocuments.net/reader034/viewer/2022052410/5561ed9ad8b42ab1068b54ed/html5/thumbnails/19.jpg)
Domainsのまとめ
関連するI/O等をまとめることができる
エラー処理をまとめることができる
まとめてキャンセルすることができる
課題 課題
どのようにドメインを構成するか?
![Page 20: 東京Node学園#3 Domains & Isolates](https://reader034.vdocuments.net/reader034/viewer/2022052410/5561ed9ad8b42ab1068b54ed/html5/thumbnails/20.jpg)
Isolates
![Page 21: 東京Node学園#3 Domains & Isolates](https://reader034.vdocuments.net/reader034/viewer/2022052410/5561ed9ad8b42ab1068b54ed/html5/thumbnails/21.jpg)
かなり昔のV8
static変数を多用
マルチスレッド非対応
複数の「Context」を利用可能
V8
Context
Context
独立した空間
Chromeでは<iframe>ごとにContextを作成
Nodeではvmモジュールで利用可能
![Page 22: 東京Node学園#3 Domains & Isolates](https://reader034.vdocuments.net/reader034/viewer/2022052410/5561ed9ad8b42ab1068b54ed/html5/thumbnails/22.jpg)
今時のV8
Isolate
独立したVMのインスタンス
1プロセスで複数のIsolateを利用可能
マルチスレッド対応 マルチスレッド対応
Isolateは複数のContextを利用可能
V8
Isolate
Context
Isolate
Context
Isolate
Context
Context Context Context
![Page 23: 東京Node学園#3 Domains & Isolates](https://reader034.vdocuments.net/reader034/viewer/2022052410/5561ed9ad8b42ab1068b54ed/html5/thumbnails/23.jpg)
V8のIsolateを使うと
NodeでもNodeでもマルチスレッドが利用可能に!!
![Page 24: 東京Node学園#3 Domains & Isolates](https://reader034.vdocuments.net/reader034/viewer/2022052410/5561ed9ad8b42ab1068b54ed/html5/thumbnails/24.jpg)
Isolates
V8のIsolateを利用
マルチスレッド対応
スレッド毎に一つのV8 Isolate
スレッド毎に独立したイベントループを持つ
Isolate間の共有変数はない
![Page 25: 東京Node学園#3 Domains & Isolates](https://reader034.vdocuments.net/reader034/viewer/2022052410/5561ed9ad8b42ab1068b54ed/html5/thumbnails/25.jpg)
IsolatesのAPI (1)
低水準API (非public)
process._newIsolate()
process._joinIsolate()
いずれ@jovi0608が解説してくれるはず いずれ@jovi0608が解説してくれるはず!
![Page 26: 東京Node学園#3 Domains & Isolates](https://reader034.vdocuments.net/reader034/viewer/2022052410/5561ed9ad8b42ab1068b54ed/html5/thumbnails/26.jpg)
IsolatesのAPI (2)
高水準API
child_process改めexec.fork()
Isolatesが有効だと子プロセスではなく別スレッドでV8 Isolateを起動別スレッドでV8 Isolateを起動
同じアプリをマルチプロセスでもマルチスレッドでも実行可能に
もちろんcluster.fork()も同様
![Page 27: 東京Node学園#3 Domains & Isolates](https://reader034.vdocuments.net/reader034/viewer/2022052410/5561ed9ad8b42ab1068b54ed/html5/thumbnails/27.jpg)
cluster
Isolates有効
Process
デフォルト(Isolates無効)
Isolate(Worker)
Isolate(Worker)
Isolate(Master)
Process(Worker)
Process(Worker)
Process(Master)
![Page 28: 東京Node学園#3 Domains & Isolates](https://reader034.vdocuments.net/reader034/viewer/2022052410/5561ed9ad8b42ab1068b54ed/html5/thumbnails/28.jpg)
なぜ(今さら)マルチスレッド?
本当のところは知りません
以下推測 (妄想) でお送りします
![Page 29: 東京Node学園#3 Domains & Isolates](https://reader034.vdocuments.net/reader034/viewer/2022052410/5561ed9ad8b42ab1068b54ed/html5/thumbnails/29.jpg)
コアメンバーの6/8が関連企業に所属
クラウド企業に支えられるNode
Joyent @ry @isaacs
Rackspace @bnoordhuis @pquerna
@piscisaureus Cloud9 IDE
@igorzi Microsoft
![Page 30: 東京Node学園#3 Domains & Isolates](https://reader034.vdocuments.net/reader034/viewer/2022052410/5561ed9ad8b42ab1068b54ed/html5/thumbnails/30.jpg)
シングルコアのVMで一プロセス
PaaSでの利用形態(1)
VM VM VMVM
Process Process Process Process
![Page 31: 東京Node学園#3 Domains & Isolates](https://reader034.vdocuments.net/reader034/viewer/2022052410/5561ed9ad8b42ab1068b54ed/html5/thumbnails/31.jpg)
複数コアのVMで複数プロセス
PaaSでの利用形態(2)
VM
Process Process Process Process
![Page 32: 東京Node学園#3 Domains & Isolates](https://reader034.vdocuments.net/reader034/viewer/2022052410/5561ed9ad8b42ab1068b54ed/html5/thumbnails/32.jpg)
複数コアのVMで複数スレッド
Process
PaaSでの利用形態(3)
VM
Process
Thread Thread Thread Thread
![Page 33: 東京Node学園#3 Domains & Isolates](https://reader034.vdocuments.net/reader034/viewer/2022052410/5561ed9ad8b42ab1068b54ed/html5/thumbnails/33.jpg)
Isolatesの狙い (推測)
性能 (CPU以外のボトルネックがなければ)
複数VM ≒複数プロセス≒複数スレッド
必要なリソース
複数VM >複数プロセス>複数スレッド
Isolatesにより
PaaS提供側のメリット
少ないリソースで同等の性能を提供可能
PaaS利用側のメリット
同等の性能を低コストで利用可能
![Page 34: 東京Node学園#3 Domains & Isolates](https://reader034.vdocuments.net/reader034/viewer/2022052410/5561ed9ad8b42ab1068b54ed/html5/thumbnails/34.jpg)
忍者に聞いてみよう!
![Page 35: 東京Node学園#3 Domains & Isolates](https://reader034.vdocuments.net/reader034/viewer/2022052410/5561ed9ad8b42ab1068b54ed/html5/thumbnails/35.jpg)
Isolatesまとめ
V8 Isolateを利用してマルチスレッドを利用可能に
マルチスレッドによるクラスタも可能に
同じアプリケーションがマルチプロセスとマルチスレッドどちらでも動作可能
課題
アドオン
マルチスレッドに対応していないと使えない
またふるい落とされるアドオン増加?
![Page 36: 東京Node学園#3 Domains & Isolates](https://reader034.vdocuments.net/reader034/viewer/2022052410/5561ed9ad8b42ab1068b54ed/html5/thumbnails/36.jpg)
Q&A
![Page 37: 東京Node学園#3 Domains & Isolates](https://reader034.vdocuments.net/reader034/viewer/2022052410/5561ed9ad8b42ab1068b54ed/html5/thumbnails/37.jpg)
ご清聴ありがとうございました
JavaScript Advent Calendar 2011(Node.js/WebSocketsコース)
http://atnd.org/events/21979
参加してね!! 参加してね!!