現役エンジニアがNode.jsを解説! 〜Node.jsの特徴〜

公開日:2022-07-31
JavaScript
Node.js

https://www.youtube.com/watch?v=WeqY1r9T2to

この講座はYouTubeで動画形式でも用意しています。合わせてご覧ください。

目的

Node.jsの特徴を理解する。

Node.jsの特徴

Node.jsはスケーラブルなネットワークアプリケーションを構築するために設計された非同期型のイベント駆動のJavaScript環境です。

https://nodejs.org/ja/about/https://nodejs.org/ja/about/

Node.jsが誕生する背景:C10K問題

サーバーのハードウェア性能は問題ないにもかかわらず、クライアントの同時接続数が多くなると急激にサービスの応答が遅くなります。これらの現象は「C10K問題」と呼ばれるようになります。今でも使用されていますが、かつてはLAMP(Linux、Apache、MySQL、PHP)の技術スタックで構成されたWebサーバーやWebサービスが広く使われていました。これら従来のサーバーではマルチプロセスやマルチスレッドでリクエストを処理していることに起因して、C10K問題が起きていました。

C10K問題の主な原因

プロセス数の上限

Apacheでは1つのリクエストに対して1つのプロセスを割り当てて処理をする方法が一般的であり、上限を超えるプロセスは生成できません。そのため、1リクエスト1プロセス方式ではプロセス数の上限以上のリクエストを同時に処理できません。

コンテキストスイッチのコスト

コンテキストスイッチ (context switch) とは、複数のプロセスが1つのCPUを共有できるように、CPUの状態(コンテキスト (情報工学))を保存したり復元したりする過程のことである。
コンテキストスイッチはマルチタスクオペレーティングシステムに不可欠な機能です。
出典: フリー百科事典『ウィキペディア(Wikipedia)』

簡単に説明すると、コンテキストスイッチとは1つのCPUがいくつかのプロセスを処理する際、それまでの処理を一旦記録し他の処理の内容の復元した状態に変える作業のことです。1リクエスト1プロセス方式ではプロセス数の上限があるため、コンテキストスイッチのコストが無視できなくなります。

ファイルディスクリプタの上限

ファイルディスクリプタとは、プログラムからファイルを操作する際にファイルの識別のためなどに割り当てられる番号のことです。この番号は一度に使える上限が設定されているため、その上限以上の同時接続は出来ず、同時に捌けるリクエストを制限する要因になっています。

C10K問題の解決方法

サーバーの台数を増やすことで対応も出来ますが、シングルプロセス・シングルスレッドでリクエストを捌くというアプローチでの解決があります。そこで使用されるのが、非同期・ノンブロックI/Oです。非同期とは、完了を待たずに(ブロックせずに)別の処理を行うことです。家事に例えると洗濯機や炊飯器を動かしている最中に他の家事をするイメージで時間を有効活用できるということです。I/Oとは、入出力処理でとても時間がかかる処理です。ノンブロックI/Oではファイルの読み込みや書き込みなどをブロックせずに処理を走らせつつ次の処理へと進めます。

非同期・ノンブロックI/Oの使用によってシングルプロセス・シングルスレッドでも並列的にリクエストを扱えるようになります。

このアプローチで作られたWebサーバーがnginxです。

https://www.nginx.com/https://www.nginx.com/

そして今回の本題でもあるNode.jsは、これらのアプローチを実現することを目的に存在しており、特徴としてシングルプロセス・シングルスレッド・非同期I/Oに基づいて設計されています。

Node.jsが使用される場面

1. サーバーサイドのJavaScript実行環境

Node.jsを選ぶ理由として、PHPやRuby on RailsなどのWebアプリからのパフォーマンス改善、フロントエンドと開発言語を共通化することでの開発の効率化などが挙げられます。

Node.jsで使用される人気のWebフレームワークとしてExpressがあリます。

https://expressjs.com/https://expressjs.com/

今後の講座ではExpressを用いたサーバーサイドの開発も扱っていきます。

2. クライアントサイドJavaScriptの開発環境

webpack、BabelやTypeScriptなどの実行環境として、フロントエンドの開発のみでもNode.jsが用いられる。主要なフロントエンドの開発ツール(webpack、BabelやTypeScriptなど)では、動作環境にNode.jsが用いられているため。

https://webpack.js.org/https://webpack.js.org/

https://babeljs.io/https://babeljs.io/

https://www.typescriptlang.org/https://www.typescriptlang.org/

3. スマホアプリやデスクトップアプリの開発および実行環境

React NativeやElectronなどの開発ツール

React Nativeは、JavaScriptでスマートフォンアプリを開発できるフレームワークです。

https://reactnative.dev/https://reactnative.dev/

Electronは、デスクトップアプリを開発するフレームワークですが、Webベースで実装・開発し、それをデスクトップアプリにも変換できるツールです。Visual Studio CodeやTwitchなどでも使用されています。

https://www.electronjs.org/https://www.electronjs.org/

まとめ

今回はNode.jsの特徴について説明していきました。次回以降は実際にコードを書きながら解説していきます。