Node.jsについてまとめた

現在ウェブアプリケーションを開発するにあたってバックエンドで動作する言語とフレームワークがいくつかあります。
そのなかでも今回はNode.jsについてを自分なりにまとめます。

Node.jsとは

Node.jsとはJavaScriptを言語としてサーバサイドの環境。
JavaScriptは、現在ほとんどのウェブサイトで動作していてウェブサイト構築初心者から上級者、モバイルアプリ開発、バックエンド開発まで幅広く使用される言語になっている。

Node.jsの特徴
  • イベントループモデルによる10K問題の解決
  • ノンブロッキングI/Oかつ非同期駆動
  • 言語学習の容易さ

イベントループモデルによる10K問題の解決

10K問題とは?
クライアント数が1万台を超える接続のときに大量にメモリが消費され処理効率が落ちるもしくはサーバがダウンしてしまう問題

Node.jsのイベントループモデルは、シングルスレッドでひたすらにイベント(I/Oとか通信とか)を受け付け続ける(いわゆる無限ループ)
でも、シングルスレッドでこのループがされていてスレッドが増えることがないからメモリの消費が増えない。
これがNode.jsがシングルスレッドで動いているように見える理由。

ノンブロッキングI/Oかつ非同期駆動

これがノンブロッキングI/O

イベントループモデルのシングルスレッドは自身で管理しているイベントによって自身のスレッドをブロックされないように、メインスレッドとは別のスレッドを立ち上げイベントの処理をする。そしてメインのシングルスレッドはブロックされずに処理(イベントの受け付け、イベント自体の終了処理とか)が実行される

ここが非同期駆動

イベントの処理をしていた別スレッドから処理の完了のCallBackを受けメインスレッドがそれに対する最終的な処理を実行しそのイベントが終了する。

MEMO
libeioという非同期I/Oライブラリを使用している。

参考 libeiosoftware.schmorp.de

参考にしたサイト

参考 node.js のソースぐらい読んでおきたい!d.hatena.ne.jp 参考 node.js とは何かd.hatena.ne.jp 参考 そのNode.jsの認識ちょっと違うんじゃないの?って思って調べて考えてみたedutainment-fun.com

一折読んで理解したつもりですが、間違ってたら教えてください。

言語学習の容易さ

これに関しては冒頭で紹介した通りでフロントエンド開発をしていた人でもサーバサイドの開発を同じ言語ですることが可能になる。
また本格的にフロントエンドエンジニアをしていなくてもというか初心者でもある程度JSに対する知識があれば新しく言語を学び直さなくてもサーバサイドの開発ができるというわけ。

Node.jsを利用すべきところ

イベントループモデルやノンブロッキングI/Oを最大限利用できることろで利用するのがベスト。
つまり、大量にイベントが発生してもすべてササッと終了するようなイベントをするシステム。

例えば
  • ユーザ同士のチャットのサーバ
  • ソーシャルゲームの動きを伝えるサーバ
  • 決済システム

実際の導入事例。

参考 生放送と連動したミッションクリティカルなメッセージ配信プラットフォームclassmethod.jp 参考 ピグライフはこう動いているwww.slideshare.net 参考 PayPal社がバックエンドをJavaからJavaScriptへ移行www.infoq.com

ウェブアプリケーションフレームワーク

いくつか存在するが個人的にはExpressを積極的に使っている。
単純にExpressの参考記事が多いため問題にぶち当たったときに解決策が見つかりやすい。

また、それぞれのフレームワークでは書き方が結構違うため自分の好みも分かれる。
一度サンプルコードを見てみると良い。

代表的なウェブアプリケーションフレームワーク
  • Express
  • koa
  • hapi
  • Sails
  • Meteor

比較についてはこちら。

参考 Node用Webアプリケーションフレームワークを比較するqiita.com

まとめ

さらっとしかわかっていなかったNode.jsについてそれなりに説明できるほどには理解できました。
不安定であるとかJavascriptとしてのオブジェクト指向のもろさから本番システムで使うには微妙等の意見もありますが、プロトタイプの制作は気軽にできますし、Websocketを利用したリアルタイム送受信などではかなり力を発揮します。
DjangoやRuby on Rails等、他の言語にも様々なWebアプリケーションフレームワークが存在しますが適材適所Node.jsの強みを意識した言語フレームワーク選定が重要だなと改めて実感しました。

コメントを残す