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