東京node学園#3 domains & isolates

37
東京NODE学園 3時限目 DOMAINS ISOLATES DOMAINS & ISOLATES @koichik

Upload: koichik

Post on 24-May-2015

6.203 views

Category:

Documents


5 download

TRANSCRIPT

Page 1: 東京Node学園#3 Domains & Isolates

東京NODE学園 3時限目

DOMAINS ISOLATESDOMAINS & ISOLATES

@koichik

Page 2: 東京Node学園#3 Domains & Isolates

自己紹介

@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

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

次期安定版

v0.8

2012/01リリース予定

V8のリリースサイクルに合わせて短期間で頻繁なリリースを目指す短期間で頻繁なリリースを目指す

新機能の目玉

Domains

Isolates

Page 5: 東京Node学園#3 Domains & Isolates

担当するのはこの人達

Domains担当@piscisaureus

Isolates担当@bnoordhuis@ry

@isaacs @cramforce

Page 6: 東京Node学園#3 Domains & Isolates

注意

現在絶賛開発中

仕様も実装も激変する可能性大

話半分ということで

Page 7: 東京Node学園#3 Domains & Isolates

Domains

Page 8: 東京Node学園#3 Domains & Isolates

エラーハンドリング

EventEmitterで'error'イベントが発生

リスナがなければ例外がスローされる

例外がイベントループに達する

processで'uncaughtException'イベントが発生

processで'uncaughtException'イベントが発生 リスナがなければスタックトレースを出力してプロセスは終了

http://d.hatena.ne.jp/koichik/20111213

Page 9: 東京Node学園#3 Domains & Isolates

エラー処理の粒度

EventEmitter

細かすぎる

process

大雑把すぎる

Page 10: 東京Node学園#3 Domains & Isolates

そこで

関連するイベントをひとまとめに

それがDomains

適切な粒度でエラーハンドリング可能

Domainsにまとめられるイベント Domainsにまとめられるイベント

対応モジュール (11/12/13時点)

net (tls, http, https)

dns

fs

timers

handleとして抽象化

Page 11: 東京Node学園#3 Domains & Isolates

Domainsの使い方

実装はdomains2ブランチ

masterにはマージされていない

デフォルトはDomains無効

--domainsオプションで有効化

domainsモジュール

var domains = require('domains');

Page 12: 東京Node学園#3 Domains & Isolates

ドメインの作成

domains.createDomain(arg, cb)

新しいドメインを作成して返す

イベントループに戻った後、作成されたドメインでcbが呼び出される作成されたドメインでcbが呼び出される

コンテキストベース

createDomain()の第1引数argがcbに渡される

cb内で行うI/O等は作成されたドメインに関連づけられる

Page 13: 東京Node学園#3 Domains & Isolates

「現在の」ドメイン(デフォルトドメイン)

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

ドメインのエラー処理

'error'イベントのリスナを登録する

myDomain.on('error', listener)

ドメインに関連づけられたI/O等で発生したエラーをまとめて処理発生したエラーをまとめて処理

ドメイン内の他のI/Oはキャンセルされる

Page 15: 東京Node学園#3 Domains & Isolates

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

エラーハンドリング (v0.8~)

EventEmitterで'error'イベントが発生

リスナがなければ例外がスローされる

例外がイベントループに達する

非デフォルトドメイン実行中ならそのドメインで 非デフォルトドメイン実行中ならそのドメインで'error'イベントが発生

デフォルトドメイン実行中ならprocessで'uncaughtException'イベントが発生

processで'uncaughtException'イベントが発生

リスナがなければスタックトレースを出力してプロセスは終了

Page 17: 東京Node学園#3 Domains & Isolates

domainsのその他API

domains.getCurrent()

現在のドメインを返す

domains.add(handle)

handleを現在のドメインに追加

domains.remove(handle)

handleを現在のドメインから削除

domains.addDefaultDomain(handle)

handleをデフォルトドメインに追加

Page 18: 東京Node学園#3 Domains & Isolates

DomainオブジェクトのAPI

domain.kill()

ドメインに関連づけられたI/O等(handle)を全てキャンセル

Page 19: 東京Node学園#3 Domains & Isolates

Domainsのまとめ

関連するI/O等をまとめることができる

エラー処理をまとめることができる

まとめてキャンセルすることができる

課題 課題

どのようにドメインを構成するか?

Page 20: 東京Node学園#3 Domains & Isolates

Isolates

Page 21: 東京Node学園#3 Domains & Isolates

かなり昔のV8

static変数を多用

マルチスレッド非対応

複数の「Context」を利用可能

V8

Context

Context

独立した空間

Chromeでは<iframe>ごとにContextを作成

Nodeではvmモジュールで利用可能

Page 22: 東京Node学園#3 Domains & Isolates

今時のV8

Isolate

独立したVMのインスタンス

1プロセスで複数のIsolateを利用可能

マルチスレッド対応 マルチスレッド対応

Isolateは複数のContextを利用可能

V8

Isolate

Context

Isolate

Context

Isolate

Context

Context Context Context

Page 23: 東京Node学園#3 Domains & Isolates

V8のIsolateを使うと

NodeでもNodeでもマルチスレッドが利用可能に!!

Page 24: 東京Node学園#3 Domains & Isolates

Isolates

V8のIsolateを利用

マルチスレッド対応

スレッド毎に一つのV8 Isolate

スレッド毎に独立したイベントループを持つ

Isolate間の共有変数はない

Page 25: 東京Node学園#3 Domains & Isolates

IsolatesのAPI (1)

低水準API (非public)

process._newIsolate()

process._joinIsolate()

いずれ@jovi0608が解説してくれるはず いずれ@jovi0608が解説してくれるはず!

Page 26: 東京Node学園#3 Domains & Isolates

IsolatesのAPI (2)

高水準API

child_process改めexec.fork()

Isolatesが有効だと子プロセスではなく別スレッドでV8 Isolateを起動別スレッドでV8 Isolateを起動

同じアプリをマルチプロセスでもマルチスレッドでも実行可能に

もちろんcluster.fork()も同様

Page 27: 東京Node学園#3 Domains & Isolates

cluster

Isolates有効

Process

デフォルト(Isolates無効)

Isolate(Worker)

Isolate(Worker)

Isolate(Master)

Process(Worker)

Process(Worker)

Process(Master)

Page 28: 東京Node学園#3 Domains & Isolates

なぜ(今さら)マルチスレッド?

本当のところは知りません

以下推測 (妄想) でお送りします

Page 29: 東京Node学園#3 Domains & Isolates

コアメンバーの6/8が関連企業に所属

クラウド企業に支えられるNode

Joyent @ry @isaacs

Rackspace @bnoordhuis @pquerna

@piscisaureus Cloud9 IDE

@igorzi Microsoft

Page 30: 東京Node学園#3 Domains & Isolates

シングルコアのVMで一プロセス

PaaSでの利用形態(1)

VM VM VMVM

Process Process Process Process

Page 31: 東京Node学園#3 Domains & Isolates

複数コアのVMで複数プロセス

PaaSでの利用形態(2)

VM

Process Process Process Process

Page 32: 東京Node学園#3 Domains & Isolates

複数コアのVMで複数スレッド

Process

PaaSでの利用形態(3)

VM

Process

Thread Thread Thread Thread

Page 33: 東京Node学園#3 Domains & Isolates

Isolatesの狙い (推測)

性能 (CPU以外のボトルネックがなければ)

複数VM ≒複数プロセス≒複数スレッド

必要なリソース

複数VM >複数プロセス>複数スレッド

Isolatesにより

PaaS提供側のメリット

少ないリソースで同等の性能を提供可能

PaaS利用側のメリット

同等の性能を低コストで利用可能

Page 34: 東京Node学園#3 Domains & Isolates

忍者に聞いてみよう!

Page 35: 東京Node学園#3 Domains & Isolates

Isolatesまとめ

V8 Isolateを利用してマルチスレッドを利用可能に

マルチスレッドによるクラスタも可能に

同じアプリケーションがマルチプロセスとマルチスレッドどちらでも動作可能

課題

アドオン

マルチスレッドに対応していないと使えない

またふるい落とされるアドオン増加?

Page 36: 東京Node学園#3 Domains & Isolates

Q&A

Page 37: 東京Node学園#3 Domains & Isolates

ご清聴ありがとうございました

JavaScript Advent Calendar 2011(Node.js/WebSocketsコース)

http://atnd.org/events/21979

参加してね!! 参加してね!!