nodeって何?
- サーバ側で動くjavascript
- リアルタイムで高速
- 大量のリクエストも高速に捌けるので、APIなどで利用される
自分のPCにnodeの環境を作る
nodeから推奨版をインストールする。
自動的に自分のPCの環境にあったパッケージが表示されるのでインストールすればOKです。
$ node -v
v6.11.2
インストール出来ました。
とりあえずhelloworld
hello.js
$ cat hello.js
console.log('hello world')
$ node hello.js
hello world
簡単ですね
サーバの仕組みを知っておく
スレッドモデル
- Apache等で使われている
- 基本的に1リクエストに対して、1スレッドで処理を対応する
- スレッドはメモリを消費するため、瞬間的に大量のリクエストが来ると結果として多くのスレッドが立ち上がる
- スレッドが多く立ち上がり、メモリが足りなくなり、待ちリクエスト等が発生する
イベントループモデル
- スレッドは1つだけのシングルスレッド
- リクエストが来る度に、スレッドのキューにリクエストをためていく
- 裏で動いているプログラムがキューに溜まった処理を順次処理していく
- なので、リクエスト待ちは発生しない
- ただし、イベントをブロックしてしまうような書き方をすると、実際待ちが発生してしまう
- 後述する
ノンブロッキングな処理
を意識して実装する必要がある
- 後述する
ノンブロッキングな処理の書き方
まずはブロッキングな処理を見てみます。
// ブロッキングな書き方
var start = new Date().getTime();
// 1秒待つ
while (new Date().getTime() < start + 1000);
console.log('world');
この処理を実行すると、while文の処理を待つため、1秒後にworld
が表示されます。
ではノンブロッキングな処理とはどのように書くのか。
// ノンブロッキングな書き方
setTimeout(function() {
console.log('hello');
}, 1000);
console.log('world');
実行してみましょう。
$ node hello.js
world
hello
setTimeoutの処理を待たずに、先にworld
が処理されました。
これが、ノンブロッキングな処理です。
前者のように、ブロッキングな書き方をしてしまうと、
イベントループモデルのnode.jsでも、処理待ちが発生してしまうので、
処理に時間が掛かりそうな処理に関してはcallback関数を使って処理していくのがnodeの常套手段のようです。
いよいよwebサーバを作ってみる
まずは見るのが簡単だと思うので、実際に作ってみます。
server.js
// nodeのコアモジュールのhttpを使う
var http = require('http);
var server = http.createServer();
server.on('request', function(req, res) {
res.writeHead(200, {'Content-Type' : 'text/plain'});
res.write('hello world');
res.end();
});
// サーバを待ち受け状態にする
// 第1引数: ポート番号
// 第2引数: IPアドレス
server.listen(3000);
この状態で、自分のブラウザからlocalhost:3000
にアクセスしてみるとどうでしょうか。
ちゃんと表示されましたね。
これまでjavascriptはブラウザ側で動くものでしたが、node.jsはこのように簡単にwebサーバとして動かす事が出来ます。
次回以降、より具体的にwebサーバを実装していこうと思います。