東京node学園#8 let it crash!?

19
東京Node学園8時限目 @koichik

Upload: koichik

Post on 01-Jul-2015

2.513 views

Category:

Technology


1 download

TRANSCRIPT

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

東京Node学園8時限目@koichik

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

Let It Crash?

Erlangのphilosophy/principle

耐障害性に優れた堅牢なコードを書くため

Akka開発チームのブログ

http://letitcrash.com/

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

堅牢なコードを書く

Defensive Programming 失敗に備える 引数/戻り値をチェックする、例外を捕まえる

アプリがエラーから回復する

通常処理とエラー処理が混在

Let It Crash 失敗に備えない 例外を捕まえない→プロセスをクラッシュさせる

スーパーバイザがエラーから回復する

通常処理とエラー処理が分離

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

スーパーバイザ

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!?

JUST Let It Crash!

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

process.on('uncaughtException')

v0.8.3~

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

domain.on('error')

v0.10.2~

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

Let It Crash?

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

No!

Erlang

軽量プロセス (細粒度)

プロセスがクラッシュしても失う接続は0~高々1

副作用がない

プロセスのリトライが可能

Node.js

重量級のプロセス (粗粒度)

プロセスがクラッシュすると数千~数万の接続を失う

副作用がある

再起動してもプロセスの状態を回復することは不可能

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

副作用と例外

JavaScriptは副作用のある言語 Node.jsのコアライブラリも副作用を持つ

例外がスローされると未定義の状態になり得る パフォーマンスが劣化するためNode.jsのコアライブラリはtry~catchをほとんど使用していない

例外はNode.jsのコードも突き抜ける

キャッチされない例外 Node.jsの状態を未定義に

プロセスを終了すべき

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

キャッチされない例外

libuv Nodeランタイム

アプリ

例外

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

キャッチされない例外

libuv Nodeランタイム

Nodeモジュール

アプリ

例外

後処理が行われない

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

Node.jsのprinciple

Defensive Programming

例外を避ける

API呼び出しの前にパラメータをチェックする

例外を捕まえる

JSON.parse()とか

Graceful Shutdown

キャッチされない例外が発生

おだやかにプロセス終了

Clusterモジュール

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

Worker

Domainの'error'イベントリスナ

マスタプロセスとのIPCを切断

cluster.disconnect();

新規接続の受け付けを終了

server.close();

既存の接続が全て閉じるとプロセス終了

一定時間経過後に強制終了

process.exit();

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

Master

ワーカからの'disconnect'イベントリスナ

ワーカプロセスを再起動

cluster.fork();

一定時間経過後に旧ワーカを強制終了

worker.kill();

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

cluster-master

https://github.com/isaacs/cluster-master

isaacs謹製のマスタプロセス用モジュール

ワーカの起動

切断したワーカの再起動 一定時間(5秒)経過後の強制終了

ワーカ数の増減

REPL

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

課題

接続時間が長いケース

ファイルアップロード/ダウンロード

WebSocket

SPDY

ワーカの強制終了までにクライアントが切断しない

クライアントはサーバからの切断に備える必要がある

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

まとめ

Defensive に Programming かつ

Graceful に Shutdown

Let It Crashではなかった

カッコわるい

ErlangやHaskellがよければErlangやHaskellを使え

by isaacs

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

参考情報

https://github.com/joyent/node/issues/5114

https://github.com/joyent/node/issues/5149

https://groups.google.com/d/msg/nodejs/4TYtu_xnNJY/ZZgFFHNIKdAJ