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

3,729 views

Published on

Published in: Technology

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

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

×