Your SlideShare is downloading. ×
東京Node学園#8 Let It Crash!?
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

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

2,422
views

Published on

Published in: Technology

0 Comments
10 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,422
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
5
Comments
0
Likes
10
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

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

×