東京Node学園#3 Domains & Isolates

6,752 views
6,660 views

Published on

0 Comments
13 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
6,752
On SlideShare
0
From Embeds
0
Number of Embeds
649
Actions
Shares
0
Downloads
19
Comments
0
Likes
13
Embeds 0
No embeds

No notes for slide

東京Node学園#3 Domains & Isolates

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

×