1. Node.jsの特徴
Node.jsとは何か、その特徴とメリットを理解します。シングルスレッドモデル、非同期処理、豊富なエコシステムについて学び、実際の成功事例からNode.jsの効果を確認します。
この章で学べること
- Node.jsとは何かを理解する
- Node.jsの特徴とメリットを知る
- 非同期処理の仕組みを理解する
- 実際の成功事例から学ぶ
Node.jsって何?
Node.jsは、JavaScriptをサーバーサイド(バックエンド)で実行できるようにする技術です。
従来のJavaScriptはブラウザ(フロントエンド)でのみ動作していましたが、Node.jsの登場により、JavaScriptをサーバーでも実行できるようになりました。
従来のJavaScript
- ブラウザ(フロントエンド)でのみ動作
- ウェブページを動的にするための言語
Node.jsの登場
- JavaScriptをサーバーでも実行可能に
- フロントエンドとバックエンドで同じ言語を使用
- 開発効率の大幅向上
Node.jsの特徴
Node.jsには、効率的なサーバーサイド開発を可能にする4つの主要な特徴があります。
- メモリ効率がよい:単一プロセス・シングルスレッドモデルで少ないメモリで多くのリクエストを処理
- CPU効率が良い:非同期処理で待機中も他の処理を実行し、CPUを無駄にしない
- 豊富なエコシステム(npm):世界中の開発者が作成したパッケージを簡単に利用でき、開発効率を大幅に向上
- フルスタック開発:フロントエンドとバックエンドで同じJavaScriptを使用でき、開発効率が向上
単一プロセス・シングルスレッドモデル
Node.jsアプリは単一プロセスで実行され、リクエストごとに新しいスレッドは作成されません。この仕組みにより効率的な処理を実現しています。
従来のマルチスレッドモデル
Node.jsのシングルスレッドモデルのメリットを理解するために、まずは、従来のマルチスレッドモデルの仕組みと問題をみてみましょう。従来のマルチスレッドモデルでは、リクエストが発生する度に新しいスレッドを作成します。
リクエスト2 → 新しいスレッド作成 → 処理実行
リクエスト3 → 新しいスレッド作成 → 処理実行
問題点
- リクエストごとに新しいスレッドが必要
- スレッドごとにメモリが必要なため、メモリ使用量が多い
- スレッド作成・管理のオーバーヘッドが発生する
Node.jsのシングルスレッドモデル
Node.jsのシングルスレッドモデルは、新しいスレッドを作成しません。リクエストをイベントキューに追加して、1つのスレッドで順次処理をしていきます。
リクエスト2 → イベントキューに追加 → 順次処理
リクエスト3 → イベントキューに追加 → 順次処理
イベントキューとは、リクエストを待ち行列に並べておくための場所のことです。
メリット
- 1つのスレッドで複数リクエストを処理
- メモリ使用量が少ない
実例での比較
実際にどれくらい効率的になるかを例を使って説明します。1000リクエストを処理する場合を比較してみましょう。
| 項目 | 従来のマルチスレッドモデル | Node.js |
|---|---|---|
| スレッド数 | 1000個のスレッドが必要 | 1つのプロセスで処理 |
| メモリ使用量 | 約50MB × 1000 = 50GB | 約50MB |
| サーバーコスト | 高い | 大幅削減 |
削減率
99.95% (50GB → 50MB)
非同期処理
Node.jsは、ファイル読み込みやデータベースアクセスなどの待機時間中も、他の処理を実行し続けます。従来の方式では待機中にCPUが何もできませんが、Node.jsは効率的にCPUを活用します。
従来の同期処理(ブロッキング)
従来の処理方法では、ファイルを読み込んでいる間は他の作業ができません。例えば、大きなファイルを読み込むのに10秒かかるとすると、その10秒間は何もできずに待つことになります。
// ファイル読み込み中は他の処理ができない
console.log('1. 開始');
const data = fs.readFileSync('large_file.txt'); // ここで10秒停止
console.log('2. ファイル読み込み完了');
console.log('3. 次の処理');
この方法では、ファイル読み込みが完了するまで次の処理に進めません。
Node.jsの非同期処理(ノンブロッキング)
// ファイル読み込み中も他の処理を実行可能
console.log('1. 開始');
fs.readFile('large_file.txt', (err, data) => {
console.log('2. ファイル読み込み完了');
});
console.log('3. 次の処理'); // ファイル読み込みを待たずに実行
メリット
CPUサイクルの有効活用: I/O待機中も他の処理を実行することでCPUを無駄にしない
成功事例
実際にNode.jsを使って効果があった事例を紹介します。言語をNode.jsに変更することでサーバー数の削減や性能向上を達成しています。
- 移行前: Ruby on Rails
- 移行後: Node.js
- 結果: サーバー数を90%削減、メモリ使用量を大幅削減
PayPal
- 移行前: Java
- 移行後: Node.js
- パフォーマンス: 1秒間に2倍のリクエスト処理、レスポンス時間35%短縮
まとめ
Node.jsは以下の特徴により、少ないリソースで多くのアクセスを効率的に処理できます。
- 単一プロセス・シングルスレッドモデル: メモリ使用量を大幅削減
- 非同期処理: CPU効率が良い
- 豊富なエコシステム(npm): 開発効率を大幅に向上
- フルスタック開発: フロントエンドとバックエンドで同じ言語を使用
特に、リアルタイムアプリケーション(チャット、ゲーム、ストリーミング等)や、データベースアクセス、ファイル操作、ネットワーク通信などの入出力操作が処理の大部分を占めるアプリケーションにおいて、その真価を発揮します。