Node.jsを仲間にいれる為にNode.jsを理解する
はじめに
くーばねてすを倒すために今回はNode.jsを仲間にしないといけないのでNode.jsのルールを調べた(^^)/!
概要
■Node.jsってなんだ
■Node.jsのルール
をまとめた(^^)/
■Node.jsってなんだ
Node.js 単体で Web サービスなどを作ることもできるが、どちらかと言うと大規模なシステムの大量のリスエストを高速にさばく必要がある部分(例えば API とかメッセージングの部分)などで使われたりする。
これまではApacheなどでよく使われるスレッドモデルという形式で処理を実行することが多かったのだが、さらに大量のリクエストをさばけるように、イベントループ形式をNode.jsでは採用している。
スレッドモデルとは
一つのリクエストに対して一つのスレッドがたてられる。
追加でリクエストが来た場合は追加でもう一つスレッドがたてられて処理が実行される。
スレッドはメモリを消費するので大量のリクエストがきた場合はメモリを使い切ってしまい、スレッドがたてられず、処理が回らなくなってしまう。
イベントループ形式とは
メインのスレッドが一つのみになる。一つのスレッドで複数のリクエストをさばくことができる。キューでリクエストを確認したら確認した順番にバックグラウンドの処理に回される。スレッドモデルと違い、リクエストの処理を待つ必要がないので大量の処理をさばける。
注意点としては処理が終わる順番がわからないこと、プログラミング上ループをブロックしないように記述する必要がある(ノンブロッキングに記述する)。
またJavaScript の基本的な命令はそのまま使えるがNode.js ではブラウザを扱うわけではないので、Window や DOM に関する命令は使えない。
■Node.jsのルール
ノンブロッキングな処理(非同期処理)
非同期に処理を行うことで重い処理がほかの処理をブロックすることがなくなり、全体のパフォーマンスが上昇する。
Node.jsでは基本的にイベントループ形式でプログラミングするのでループを邪魔しないように、ノンブロッキングな記述する必要がある。
// console.log("hello world");
// non blocking
setTimeout(function() {
console.log("hello");
}, 1000);
console.log("world");
// blocking
var start = new Date().getTime();
while (new Date().getTime() < start + 1000);
console.log("world");
時間がかかりそうな処理に対してノンブロッキングなプログラミングをすることとして
setTimeout などのタイマー処理、
データベースへのアクセス、ファイルの書き込みといった命令、などは、次のリクエストをブロックしないように書く必要がある。
具体的には処理が終わった後に実行する処理を、関数で渡す必要がある。
この関数を「コールバック関数」という。
setTimeout(function() {
console.log("hello");
}, 1000);
console.log("world");
出力
world
hello
helloの処理を待たず、worldが先に出力された。処理がほかの処理をブロックしないで実行される。
ブロッキングな処理(同期処理)
ブロッキング処理としてコールバック関数を記述しないでプログラミングすると、Node.js プロセス内で 処理が完了するまで次の処理が実行されない。
var start = new Date().getTime();
while (new Date().getTime() < start + 1000);
console.log("world");
world (1秒たってから)
Node.js でこのような書き方をしてしまうと、メインのスレッドは 1 つなので、すべてのリクエストをブロックしてしまうことになるので注意する。
まとめ
ドットインストールありがとう😂
Discussion