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