狠狠撸

狠狠撸Share a Scribd company logo
東京Node学園8時限目
@koichik
Let It Crash?
? Erlangのphilosophy/principle
? 耐障害性に優れた堅牢なコードを書くため
? Akka開発チームのブログ
? http://letitcrash.com/
堅牢なコードを書く
? Defensive Programming
? 失敗に備える
? 引数/戻り値をチェックする、例外を捕まえる
? アプリがエラーから回復する
? 通常処理とエラー処理が混在
? Let It Crash
? 失敗に備えない
? 例外を捕まえない→プロセスをクラッシュさせる
? スーパーバイザがエラーから回復する
? 通常処理とエラー処理が分離
スーパーバイザ
1 2 3 4 5 6
S1 S2
S0
2
One for One All for One
5
retry 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

More Related Content

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