Hello, Node.js
-
Upload
shin-sekaryo -
Category
Technology
-
view
98 -
download
1
Transcript of Hello, Node.js
Hello, Node.jsShin Sekaryo
2015.7.25 新卒勉強会
世嘉良 紳 (せかりょう しん)
沖縄
名前:
出身:
TwitterID: @pxp_ss
About me
http://pxp-ss.hatenablog.comblog:
今日のゴール
15新卒の僕達が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
Node.jsとは?
Node.jsはスケーリング可能なネットワークアプリケーションを作るためのプラットフォームで、Google Chrome用JavaScript実行エンジン上で動作します. 非同期型のイベント駆動、ノンブロッキング I/O などのモデルを採用しており、 軽量で効率よく多くのリクエストを処理するネットワークアプリケーションの構築ができます.
[ゆるふわな翻訳]
要約すると
イベント駆動
ノンブロッキング I/O
効率良く多くのリクエストを処理する
効率良く多くのリクエストを処理する
世界で最初に公開されたウェブサイト
めちゃくちゃシンプル!
多種多様な機能がウェブサイトに求められる時代になった
最近のウェブサイト
c10k問題
• 1万台以上の同時接続クライアントを扱うときの課題
• クライアント数が一定数を超えるとハードウェアの性能に 問題がなくてもサーバが死んでしまう問題
Ajaxなどの新たな通信手法が生まれたことで 簡単に同時接続数が跳ね上がりやすくなってきた.
1. 各スレッドが複数のクライアントを受け付ける. そしてノンブロッキング I/O と レベル・トリガ型の完了通知を利用する.
2. 各スレッドが複数のクライアントを受け付ける. そしてノンブロッキング I/O と 変更型の完了通知を利用する.
3. 各スレッドが複数のクライアントを受けつける. そして非同期 I/O を使う
4. 各スレッドが一つのクライアントを受けつける. そしてブロッキング I/O を使う
5. サーバのコードをカーネルに組込む.
TheC10kProblem - 「C10K問題」http://www.hyuki.com/yukiwiki/wiki.cgi?TheC10kProblem
解決策
• Perl ‣ AnyEvent
• Python ‣ Twisted ‣ eventlet
• Ruby ‣ EventMachine
各言語で実装がされている
ちょっと調べただけでも
たくさん見つかる!
あれ?Node.js以外にも色々あるの…?
既存のライブラリが イベント駆動を意識していない
• Perl ‣ AnyEvent
• Python ‣ Twisted ‣ eventlet
• Ruby ‣ EventMachine
各言語で実装がされている
• マルチスレッドで動作することが前提にない言語.
• 標準のI/Oライブラリが存在しなかったため.
• Google Chrome用JavaScript実行エンジン(V8)がOSSとして公開されており,開発当時(2009年)から実用的な速度で動作した.
目をつけられたJavaScript
イベント駆動
• 起動すると共にイベントを待機し、起こったイベントに従って
処理を行うようにプログラミングすること
조아하는모든것 :: 1-2 node.js의 특징. event-driven, non-blocking I/O , 단일 스레드 http://uiandwe.tistory.com/921
イベント駆動とは?
•Apacheはリクエストの度にスレッドを起動する
•Nginxはシングルスレッドなのでリソースを効率的に使用する
Apache
Thread3
Thread6
nginx
Thread2
Thread5
Thread1
Thread4
よく見る例
Thread1
Web Server Performance Comparison - DreamHost http://wiki.dreamhost.com/Web_Server_Performance_Comparison
処理性能の比較
イベント駆動すげーじゃん!ってなる図
• node.jsでは以下のようにしてイベントを利用することができる
• 例:
イベント駆動の概念はイメージしやすいけど プログラミングには慣れが必要?
The Bad Parts
ちょっと考えてみましょう
どこが悪いか 分かりますか?
The Bad Parts
正解
イベントループを ブロックしている…
node.jsっぽく書きなおしてみる
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つのプログラムの処理を比較
まともに返ってこない
(;_;)
同期処理 イベント駆動を意識した書き方
非同期を意識してループ処理などを行う方法を考える必要がある.
イベントループを止めると
プログラムが停止してしまう!
ノンブロッキング I/O
ノンブロッキング I/Oとは?
• 入出力の完了を待たずに、システムコールが終了する入出力処理の実装
• I/O処理と並列に、データの送受信が完了していなくても可能な処理を進め、送受信が済まないと進められない処理にたどりついた場合に、そこで送受信の完了を待つ。
ブロッキングな場合の処理
Boost application performance using asynchronous I/O http://www.ibm.com/developerworks/linux/library/l-async/
ノンブロッキングな場合の処理
Boost application performance using asynchronous I/O http://www.ibm.com/developerworks/linux/library/l-async/
• 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とは?
非同期のAPIは終了した直後に呼び出す関数を登録することができる. = コールバック関数
ノンブロッキング I/Oとは?
余談• ノンブロッキング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
なんとなく違いを説明できたりしますか…?
まとめ
1. 効率良く多くのリクエストを処理する
2. イベント駆動
3. ノンブロッキング I/O
node.jsで大切な3つの要素について説明しました.
うまく説明できれば、node.js初心者からは卒業できるはず…!!
node.jsに触れる!
>> workshopper/learnyounode https://github.com/workshopper/learnyounode
御静聴ありがとうございました!
@pxp_ss