【Node】Node.js ~ 基礎知識編 ~

■ Node.js

 * 大量のリクエストを捌くことができる

公式サイト
https://nodejs.org/en/
動画サイト

分かりやすい 

https://dotinstall.com/lessons/basic_nodejs

■ 知識

スレッドモデル / イベントループ

 * Node.jsでは、イベントループを採用

スレッドモデル

 * Apacheで採用
 * 1リクエストに対して、1スレッドで対応
  => スレッドをたちあげるごとにメモリ消費されるので、大量リクエストには向かない


 +--------+ +--------+
 | Thread | | Thread |
 +--------+ +--------+
 +--------+ +--------+
 | Request| | Request|
 +--------+ +--------+

イベントループ

 * イベントを待機するループを持つ仕組み

                +----+
                |    | Event Loop (メインのスレッドは1つ。シングルスレッド)
 +----------------+  |
 |      Queue     |<-+      <= キューにリクエストを貯め受け付ける
 +----------------+
 |      I/O       |         <= 順番にバックグラウンドの処理に渡していく
 +----------------+

【注意点】

 1) 処理が終わる順番が分からない
 2) ループをブロックしないようにプログラミングする(ノンブロッキング)

ブロッキング / ノンブロッキング

 * Node.js では ノンブロッキング な書き方をしていかなくてはならない

ブロッキング

// Blocking
var start = new Date().getTime();
while (new Date().getTime() < start + 1000); // ★ここでブロッキングしている★
console.log("World");

【出力結果】

(1秒後...)
World
ノンブロッキング 
// Non-Blocking
setTimeout(function() {
   console.log("Hello, ");
}, 1000);
console.log("World");

【出力結果】

World
Hello,

関連記事

Node.js ~ 環境構築編 ~
https://dk521123.hatenablog.com/entry/2021/11/06/000000
Node.js ~ 基本編 / npm ~
https://dk521123.hatenablog.com/entry/2018/06/13/234315
Node.js ~ 基本編 / ファームデータを処理する ~
https://dk521123.hatenablog.com/entry/2018/06/17/093535