東京Node学園#8 Let It Crash!?
Upcoming SlideShare
Loading in...5
×
 

東京Node学園#8 Let It Crash!?

on

  • 2,760 views

 

Statistics

Views

Total Views
2,760
Slideshare-icon Views on SlideShare
2,675
Embed Views
85

Actions

Likes
7
Downloads
5
Comments
0

2 Embeds 85

https://twitter.com 84
https://www.chatwork.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    東京Node学園#8 Let It Crash!? 東京Node学園#8 Let It Crash!? Presentation Transcript

    • 東京Node学園8時限目@koichik
    • Let It Crash? Erlangのphilosophy/principle 耐障害性に優れた堅牢なコードを書くため Akka開発チームのブログ http://letitcrash.com/
    • 堅牢なコードを書く Defensive Programming 失敗に備える 引数/戻り値をチェックする、例外を捕まえる アプリがエラーから回復する 通常処理とエラー処理が混在 Let It Crash 失敗に備えない 例外を捕まえない→プロセスをクラッシュさせる スーパーバイザがエラーから回復する 通常処理とエラー処理が分離
    • スーパーバイザ1 2 3 4 5 6S1 S2S02One for One All for One5retry retry
    • JUST Let It Crash!
    • process.on(uncaughtException) v0.8.3~
    • domain.on(error) v0.10.2~
    • Let It Crash?
    • No! Erlang 軽量プロセス (細粒度) プロセスがクラッシュしても失う接続は0~高々1 副作用がない プロセスのリトライが可能 Node.js 重量級のプロセス (粗粒度) プロセスがクラッシュすると数千~数万の接続を失う 副作用がある 再起動してもプロセスの状態を回復することは不可能
    • 副作用と例外 JavaScriptは副作用のある言語 Node.jsのコアライブラリも副作用を持つ 例外がスローされると未定義の状態になり得る パフォーマンスが劣化するためNode.jsのコアライブラリはtry~catchをほとんど使用していない 例外はNode.jsのコードも突き抜ける キャッチされない例外 Node.jsの状態を未定義に プロセスを終了すべき
    • キャッチされない例外libuv Nodeランタイムアプリ例外
    • キャッチされない例外libuv NodeランタイムNodeモジュールアプリ例外後処理が行われない
    • Node.jsのprinciple Defensive Programming 例外を避ける API呼び出しの前にパラメータをチェックする 例外を捕まえる JSON.parse()とか Graceful Shutdown キャッチされない例外が発生 おだやかにプロセス終了 Clusterモジュール
    • Worker Domainのerrorイベントリスナ マスタプロセスとのIPCを切断 cluster.disconnect(); 新規接続の受け付けを終了 server.close(); 既存の接続が全て閉じるとプロセス終了 一定時間経過後に強制終了 process.exit();
    • Master ワーカからのdisconnectイベントリスナ ワーカプロセスを再起動 cluster.fork(); 一定時間経過後に旧ワーカを強制終了 worker.kill();
    • cluster-master https://github.com/isaacs/cluster-master isaacs謹製のマスタプロセス用モジュール ワーカの起動 切断したワーカの再起動 一定時間(5秒)経過後の強制終了 ワーカ数の増減 REPL
    • 課題 接続時間が長いケース ファイルアップロード/ダウンロード WebSocket SPDY ワーカの強制終了までにクライアントが切断しない クライアントはサーバからの切断に備える必要がある
    • まとめ Defensive に Programming かつ Graceful に Shutdown Let It Crashではなかった カッコわるい ErlangやHaskellがよければErlangやHaskellを使え by isaacs
    • 参考情報 https://github.com/joyent/node/issues/5114 https://github.com/joyent/node/issues/5149 https://groups.google.com/d/msg/nodejs/4TYtu_xnNJY/ZZgFFHNIKdAJ