TOP > Column > Node.jsの特徴

Node.jsの特徴

2021.02.26技術
Node.jsとは Node.jsは大規模なネットワークアプリケーションを構築するために設計された、イベント駆動タイプのJavaScriptを利用したWebアプリケーションです。
JavaScriptはWebサイトの複雑な動きを構築できる、代表的なプログラミング言語になります。
コンテンツの定期表示をはじめ、双方向型の地図、2Dや3DなどのグラフィックアニメーションなどもJavaScriptで構築することができます。
Node.jsは多様な接続を同時に処理することができるのが特徴です。
ただし、スレッドベースのネットワーキングによる同時実行モデルとは対照的です。
スレッドベースのネットワーキングによる同時実行は非効率で、デッドロックのリスクも少なくありません。
スレッドベースのネットワーキングを用いた同時実行処理では、2つ以上のスレッドが互いの処理終了を待ち合ってしまい、結果として、いずれの処理も先に進まなくなることがあります。
ですが、Node.jsはロックされることはありません。
なぜなら、Node.jsの関数はI/Oを直接実行しない仕様だからです。
I/Oを直接実行しないので、プロセスがブロックされることがなく、デッドロックの悩みから解放されるのがメリットです。
ブロックされないので、スケーラブルなシステムを開発するのに適しています。
イベント駆動型プログラム Node.jsはコンピューター起動時のメインプログラムと同時に動くランタイムコンストラクタの代わりに、ライブラリとしてイベントループを提供します。
そのうえで、小さなイベントモデルを持つことも特徴的です。
Node.jsはイベント駆動型プログラムなので、フロー駆動型プログラムのようにフローを書くのではなく、イベントに応じたコードを書きます。
つまり、イベントに応じて実行される内容が変化するプログラムです。
フロー駆動型プログラムの場合はフローを記述し、それに沿って、プログラムは上から下へ実行されます。
これに対して、Node.jsはイベント駆動型プログラムですで、プログラムに必要なのはイベントの監視とイベントの処理だけです。
Node.jsのメリット
 
効率的に作動 一般的なシステムではイベントループの開始時にブロッキングコールがあるのが基本です。
ブロッキングが起こると、プロセスに追加したJavaScriptの実行はJavaScript以外の操作が完了するまで待たなければなりません。
ブロッキングがなされている間は、イベントループがJavaScriptの実行を継続できないために起こります。
Node.jsではブロッキングコールのように、イベントループを開始する呼び出しはありません。
単純にスクリプトを実行した直後に、イベントループが開始されるだけです。
実行するコールバックがこれ以上なくなれば、イベントループから抜けるだけで、ブラウザ上のJavaScriptと似たような動きをします。
Node.jsでは、I/OといったJavaScript以外の操作を待つことがないためです。
JavaScriptはCPUに負荷がかかって、パフォーマンスが低下するのでブロッキングとしては呼び出されず、効率良くイベントの実行ができます。
Node.js標準ライブラリのI/Oメソッドはノンブロッキングで、コールバック関数を受け入れてくれます。
Node.jsの活用 Node.jsの第一級オブジェクト、つまり基本的な操作を制限なしに使用できる対象となるのは、HTTPです。
ストリーミングのしやすさと低遅延性を基本に構築されています。
そのため、Node.jsはWebライブラリの作成やフレームワークの基礎を作るのにおすすめです。
Node.jsはスレッドがない設計ですが、複数コアの長所を活用できないわけではありません。
通信がしやすい子プロセスを設計したい場合、child_process.fork() APIを使って生成が可能です。
そのためには、コア上でロードバランシングを有効にする必要があります。
そこで、プロセス間でソケットを共有できるcluster モジュールが同じインターフェース上に内蔵されている仕様となっています。
Node.jsのさまざまな特徴 Node.jsはサーバーサイドのJavaScript実行環境で、Google V8 JavaScriptエンジンを使用しているため、高速対応が可能です。
ノンブロッキングI/Oとイベントループ アーキテクチャにより、10K問題と呼ばれる性能が極端に悪化する問題にも対処できます。
クライアントからパケットを読み込むことやファイルの次のブロックを読み出すといったすべてのプロセスが、イベント処理で行われるのです。
通信をはじめ、ファイルの読み書きまでノンブロッキングI/Oで処理できます。
そのため、スレッドが I/O待ちになるリスクが抑えられ、効率的に利用できるのもメリットです。
JavaScript実行環境で悩んでいるのであれば、一度試してみてください。