Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Hello, Node.js

882 views

Published on

2015.7.25 新卒勉強会で発表

Published in: Technology
  • Be the first to comment

Hello, Node.js

  1. 1. Hello, Node.js Shin Sekaryo 2015.7.25 新卒勉強会
  2. 2. 世嘉良 紳 (せかりょう しん) 沖縄 名前: 出身: TwitterID: @pxp_ss About me http://pxp-ss.hatenablog.comblog:
  3. 3. 今日のゴール 15新卒の僕達がNode.jsについて ゆるっとふわっと理解する
  4. 4. Node.jsとは? Node.js® is a platform built on Chrome's JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices. Ryan Dahl
  5. 5. Node.jsとは? Node.jsはスケーリング可能なネットワークアプリケーションを作る ためのプラットフォームで、Google Chrome用JavaScript実行エン ジン上で動作します. 非同期型のイベント駆動、ノンブロッキング I/O などのモデルを採用 しており、 軽量で効率よく多くのリクエストを処理するネットワーク アプリケーションの構築ができます. [ゆるふわな翻訳]
  6. 6. 要約すると
  7. 7. イベント駆動 ノンブロッキング I/O 効率良く多くのリクエストを処理する
  8. 8. 効率良く多くのリクエストを処理する
  9. 9. 世界で最初に公開されたウェブサイト めちゃくちゃシンプル!
  10. 10. 多種多様な機能がウェブサイトに求められる時代になった 最近のウェブサイト
  11. 11. c10k問題 • 1万台以上の同時接続クライアントを扱うときの課題 • クライアント数が一定数を超えるとハードウェアの性能に  問題がなくてもサーバが死んでしまう問題 Ajaxなどの新たな通信手法が生まれたことで 簡単に同時接続数が跳ね上がりやすくなってきた.
  12. 12. 1. 各スレッドが複数のクライアントを受け付ける. そしてノンブロッキング I/O と レベル・トリガ型の完了通知を利用する. 2. 各スレッドが複数のクライアントを受け付ける. そしてノンブロッキング I/O と 変更型の完了通知を利用する. 3. 各スレッドが複数のクライアントを受けつける. そして非同期 I/O を使う 4. 各スレッドが一つのクライアントを受けつける. そしてブロッキング I/O を使う 5. サーバのコードをカーネルに組込む. TheC10kProblem - 「C10K問題」http://www.hyuki.com/yukiwiki/wiki.cgi?TheC10kProblem 解決策
  13. 13. • Perl ‣ AnyEvent • Python ‣ Twisted ‣ eventlet • Ruby ‣ EventMachine 各言語で実装がされている ちょっと調べただけでも たくさん見つかる!
  14. 14. あれ?Node.js以外にも色々あるの…?
  15. 15. 既存のライブラリが イベント駆動を意識していない • Perl ‣ AnyEvent • Python ‣ Twisted ‣ eventlet • Ruby ‣ EventMachine 各言語で実装がされている
  16. 16. • マルチスレッドで動作することが前提にない言語. • 標準のI/Oライブラリが存在しなかったため. • Google Chrome用JavaScript実行エンジン(V8)がOSSとして公開 されており,開発当時(2009年)から実用的な速度で動作した. 目をつけられたJavaScript
  17. 17. イベント駆動
  18. 18. • 起動すると共にイベントを待機し、起こったイベントに従って    処理を行うようにプログラミングすること 조아하는모든것 :: 1-2 node.js의 특징. event-driven, non-blocking I/O , 단일 스레드 http://uiandwe.tistory.com/921 イベント駆動とは?
  19. 19. • Apacheはリクエストの度にスレッドを起動する • Nginxはシングルスレッドなのでリソースを効率的に使用する Apache Thread3 Thread6 nginx Thread2 Thread5 Thread1 Thread4 よく見る例 Thread1
  20. 20. Web Server Performance Comparison - DreamHost http://wiki.dreamhost.com/Web_Server_Performance_Comparison 処理性能の比較 イベント駆動すげーじゃん!ってなる図
  21. 21. • node.jsでは以下のようにしてイベントを利用することができる • 例:
  22. 22. イベント駆動の概念はイメージしやすいけど プログラミングには慣れが必要?
  23. 23. The Bad Parts ちょっと考えてみましょう どこが悪いか 分かりますか?
  24. 24. The Bad Parts 正解 イベントループを ブロックしている…
  25. 25. node.jsっぽく書きなおしてみる
  26. 26. node.jsっぽく書きなおしてみる
  27. 27. $ab -n 1000 -c 100 http://192.168.33.10:3000/ Concurrency Level: 100 Time taken for tests: 1.638 seconds Complete requests: 1000 Failed requests: 0 Non-2xx responses: 1000 Total transferred: 160000 bytes HTML transferred: 55000 bytes Requests per second: 610.44 [#/sec] (mean) Time per request: 163.817 [ms] (mean) Time per request: 1.638 [ms] (mean, across all concurrent requests) Transfer rate: 95.38 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 7 80.0 0 1135 Processing: 50 151 23.2 148 227 Waiting: 47 150 23.2 147 226 Total: 56 157 83.7 148 1293 $ ab -n 1000 -c 100 http://192.168.33.10:3000/ Benchmarking 192.168.33.10 (be patient) apr_pollset_poll: The timeout specified has expired (70007) 2つのプログラムの処理を比較 まともに返ってこない (;_;) 同期処理 イベント駆動を意識した書き方
  28. 28. 非同期を意識してループ処理などを行う方法を考える必要がある. イベントループを止めると プログラムが停止してしまう!
  29. 29. ノンブロッキング I/O
  30. 30. ノンブロッキング I/Oとは? • 入出力の完了を待たずに、システムコールが終了する入出力処理の実装 • I/O処理と並列に、データの送受信が完了していなくても可能な処理を進め、 送受信が済まないと進められない処理にたどりついた場合に、そこで送受 信の完了を待つ。
  31. 31. ブロッキングな場合の処理 Boost application performance using asynchronous I/O http://www.ibm.com/developerworks/linux/library/l-async/
  32. 32. ノンブロッキングな場合の処理 Boost application performance using asynchronous I/O http://www.ibm.com/developerworks/linux/library/l-async/
  33. 33. • node.jsでは、非同期・同期をそれぞれ扱うためのAPIが提供されている. • 例: ‣ fs.write(fd, buffer, offset, length[, position], callback) ‣ fs.writeSync(fd, buffer, offset, length[, position]) ‣ fs.mkdir(path[, mode], callback) ‣ fs.mkdirSync(path[, mode]) ノンブロッキング I/Oとは?
  34. 34. 非同期のAPIは終了した直後に呼び出す関数を登録することができる. = コールバック関数 ノンブロッキング I/Oとは?
  35. 35. 余談 • ノンブロッキングI/Oと非同期I/Oの違いを理解する ¦ PAYFORWARD http://blog.takanabe.tokyo/2015/03/26/240/ • Node.jsと非同期I/Oと混乱した私 - shutdown -r now http://d.hatena.ne.jp/forest1040/20110407/1302150936 なんとなく違いを説明できたりしますか…?
  36. 36. まとめ 1. 効率良く多くのリクエストを処理する 2. イベント駆動 3. ノンブロッキング I/O node.jsで大切な3つの要素について説明しました. うまく説明できれば、node.js初心者からは卒業できるはず…!!
  37. 37. node.jsに触れる! >> workshopper/learnyounode https://github.com/workshopper/learnyounode
  38. 38. 御静聴ありがとうございました! @pxp_ss

×