Hello, Node.js

39
Hello, Node.js Shin Sekaryo 2015.7.25 新卒勉強会

Transcript of Hello, Node.js

Page 1: Hello, Node.js

Hello, Node.jsShin Sekaryo

2015.7.25 新卒勉強会

Page 2: Hello, Node.js

世嘉良 紳 (せかりょう しん)

沖縄

名前:

出身:

TwitterID: @pxp_ss

About me

http://pxp-ss.hatenablog.comblog:

Page 3: Hello, Node.js
Page 4: Hello, Node.js

今日のゴール

15新卒の僕達がNode.jsについて ゆるっとふわっと理解する

Page 5: Hello, Node.js

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

Page 6: Hello, Node.js

Node.jsとは?

Node.jsはスケーリング可能なネットワークアプリケーションを作るためのプラットフォームで、Google Chrome用JavaScript実行エンジン上で動作します. 非同期型のイベント駆動、ノンブロッキング I/O などのモデルを採用しており、 軽量で効率よく多くのリクエストを処理するネットワークアプリケーションの構築ができます.

[ゆるふわな翻訳]

Page 7: Hello, Node.js

要約すると

Page 8: Hello, Node.js

イベント駆動

ノンブロッキング I/O

効率良く多くのリクエストを処理する

Page 9: Hello, Node.js

効率良く多くのリクエストを処理する

Page 10: Hello, Node.js

世界で最初に公開されたウェブサイト

めちゃくちゃシンプル!

Page 11: Hello, Node.js

多種多様な機能がウェブサイトに求められる時代になった

最近のウェブサイト

Page 12: Hello, Node.js

c10k問題

• 1万台以上の同時接続クライアントを扱うときの課題

• クライアント数が一定数を超えるとハードウェアの性能に 問題がなくてもサーバが死んでしまう問題

Ajaxなどの新たな通信手法が生まれたことで 簡単に同時接続数が跳ね上がりやすくなってきた.

Page 13: Hello, Node.js

1. 各スレッドが複数のクライアントを受け付ける. そしてノンブロッキング I/O と レベル・トリガ型の完了通知を利用する.

2. 各スレッドが複数のクライアントを受け付ける. そしてノンブロッキング I/O と 変更型の完了通知を利用する.

3. 各スレッドが複数のクライアントを受けつける. そして非同期 I/O を使う

4. 各スレッドが一つのクライアントを受けつける. そしてブロッキング I/O を使う

5. サーバのコードをカーネルに組込む.

TheC10kProblem - 「C10K問題」http://www.hyuki.com/yukiwiki/wiki.cgi?TheC10kProblem

解決策

Page 14: Hello, Node.js

• Perl ‣ AnyEvent

• Python ‣ Twisted ‣ eventlet

• Ruby ‣ EventMachine

各言語で実装がされている

ちょっと調べただけでも

たくさん見つかる!

Page 15: Hello, Node.js

あれ?Node.js以外にも色々あるの…?

Page 16: Hello, Node.js

既存のライブラリが イベント駆動を意識していない

• Perl ‣ AnyEvent

• Python ‣ Twisted ‣ eventlet

• Ruby ‣ EventMachine

各言語で実装がされている

Page 17: Hello, Node.js

• マルチスレッドで動作することが前提にない言語.

• 標準のI/Oライブラリが存在しなかったため.

• Google Chrome用JavaScript実行エンジン(V8)がOSSとして公開されており,開発当時(2009年)から実用的な速度で動作した.

目をつけられたJavaScript

Page 18: Hello, Node.js

イベント駆動

Page 19: Hello, Node.js

• 起動すると共にイベントを待機し、起こったイベントに従って  

 処理を行うようにプログラミングすること

조아하는모든것 :: 1-2 node.js의 특징. event-driven, non-blocking I/O , 단일 스레드 http://uiandwe.tistory.com/921

イベント駆動とは?

Page 20: Hello, Node.js

•Apacheはリクエストの度にスレッドを起動する

•Nginxはシングルスレッドなのでリソースを効率的に使用する

Apache

Thread3

Thread6

nginx

Thread2

Thread5

Thread1

Thread4

よく見る例

Thread1

Page 21: Hello, Node.js

Web Server Performance Comparison - DreamHost http://wiki.dreamhost.com/Web_Server_Performance_Comparison

処理性能の比較

イベント駆動すげーじゃん!ってなる図

Page 22: Hello, Node.js

• node.jsでは以下のようにしてイベントを利用することができる

• 例:

Page 23: Hello, Node.js

イベント駆動の概念はイメージしやすいけど プログラミングには慣れが必要?

Page 24: Hello, Node.js

The Bad Parts

ちょっと考えてみましょう

どこが悪いか 分かりますか?

Page 25: Hello, Node.js

The Bad Parts

正解

イベントループを ブロックしている…

Page 26: Hello, Node.js

node.jsっぽく書きなおしてみる

Page 27: Hello, Node.js

node.jsっぽく書きなおしてみる

Page 28: Hello, Node.js

$ab -n 1000 -c 100 http://192.168.33.10:3000/Concurrency Level: 100Time taken for tests: 1.638 secondsComplete requests: 1000Failed requests: 0Non-2xx responses: 1000Total transferred: 160000 bytesHTML transferred: 55000 bytesRequests 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 maxConnect: 0 7 80.0 0 1135Processing: 50 151 23.2 148 227Waiting: 47 150 23.2 147 226Total: 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つのプログラムの処理を比較

まともに返ってこない

(;_;)

同期処理 イベント駆動を意識した書き方

Page 29: Hello, Node.js

非同期を意識してループ処理などを行う方法を考える必要がある.

イベントループを止めると

プログラムが停止してしまう!

Page 30: Hello, Node.js

ノンブロッキング I/O

Page 31: Hello, Node.js

ノンブロッキング I/Oとは?

• 入出力の完了を待たずに、システムコールが終了する入出力処理の実装

• I/O処理と並列に、データの送受信が完了していなくても可能な処理を進め、送受信が済まないと進められない処理にたどりついた場合に、そこで送受信の完了を待つ。

Page 32: Hello, Node.js

ブロッキングな場合の処理

Boost application performance using asynchronous I/O http://www.ibm.com/developerworks/linux/library/l-async/

Page 33: Hello, Node.js

ノンブロッキングな場合の処理

Boost application performance using asynchronous I/O http://www.ibm.com/developerworks/linux/library/l-async/

Page 34: Hello, Node.js

• 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とは?

Page 35: Hello, Node.js

非同期のAPIは終了した直後に呼び出す関数を登録することができる. = コールバック関数

ノンブロッキング I/Oとは?

Page 36: Hello, Node.js

余談• ノンブロッキング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

なんとなく違いを説明できたりしますか…?

Page 37: Hello, Node.js

まとめ

1. 効率良く多くのリクエストを処理する

2. イベント駆動

3. ノンブロッキング I/O

node.jsで大切な3つの要素について説明しました.

うまく説明できれば、node.js初心者からは卒業できるはず…!!

Page 38: Hello, Node.js

node.jsに触れる!

>> workshopper/learnyounode https://github.com/workshopper/learnyounode

Page 39: Hello, Node.js

御静聴ありがとうございました!

@pxp_ss