東京Node学園#3 Domains & Isolates

Post on 24-May-2015

6.203 views 5 download

Transcript of 東京Node学園#3 Domains & Isolates

東京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

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