Date post: | 01-Jul-2015 |
Category: |
Technology |
Upload: | koichik |
View: | 2,507 times |
Download: | 1 times |
東京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