支援対象地域:札幌、仙台、関東、愛知、関西、広島、福岡


はじめに

Node.jsはフロントエンド開発の現場で頻繁に用いられています。
WEB開発を行うにあたって、今まで扱ったことはないけれど初めてインストールをしたというエンジニアの皆さんもいると思います。
しかしながら、「どうしてNode.jsを使うのか?」「Node.jsでは何ができるのか?」「JavaScriptをサーバサイドで使われるとは聞いたけれど、だから何?」「スケーラブル?」というように、実はよくわかっていないという方もいらっしゃるのではないでしょうか。
様々な開発現場で採用されていることもあり、そのフレームワークや外部ツール、ライブラリを学習する機会は多いけれど、Node.jsそのものの学習というのは実はそこまで機会が多いわけではありません

本記事ではNode.jsそのものに焦点を当てて、Node.jsのメリットや利用方法を紹介していきます。詳しく知らなくても操作方法さえわかればNode.jsは扱えますが、Node.jsの特性を理解すれば、エンジニアとしてのスキルは格段に上昇することでしょう。

Node.jsって何?

Node.jsは、JavaScriptをサーバサイドでも実行できるようにさせるためのプラットフォームです。
この説明をなんとなく聞いたことのある方は多いと思います。しかし、サーバサイドで動くから何なの?という疑問も生まれるのではないでしょうか。

JavaScriptをサーバサイドで実行させることで、サーバの制御やアプリケーションの動作、データ処理などを行うことができるようになります。このサーバの制御がJavaScriptで可能になるという点がミソであり、サーバを動かすための特定の技術を学習するコストを大きくかけることなく、JavaScriptの知識を持ち合わせていれば動かすことができる点で汎用性に優れているのです。
元々フロントエンド側の言語であるJavaScriptで、この操作を行える点が評価されています。

Node.jsの特徴

サーバサイドでJavaScriptを動作させることでサーバの制御ができる点以外にも、Node.jsは様々な特徴を持ち合わせています。

非同期処理ができる

Node.jsは非同期処理を行うことができるため、動作が高速になるという特徴を持っています。
プログラムの処理の流れには、「同期処理」と「非同期処理」の2種類があります。

一般的にイメージされるプログラミング言語における書き方が「同期処理」と呼ばれるもので、これはプログラムのソースを上から下へ、順番に実行していくことを指します。
その性質上、1つの処理が完全に終了して初めて次の処理に進むという方法です。確実に処理が完了するため、同じプログラムであれば基本的には同じ結果が返ってくるので確実性はありますが、その分時間のかかる処理に対しては、ある程度の待ち時間が発生してしまいます。たとえ並行して処理して問題がないプログラムであっても待機してしまうため、結果的には処理時間が増してしまう、というデメリットを持ち合わせているのがこの同期処理です。フォール型のイメージを持っていただくとわかりやすいでしょう。

一方で、「非同期処理」は、プログラムの終了を待たず、並行して次の処理を行うことが可能です。仮にプログラム中で前の処理の結果が必要な処理があったとしても、進められる段階まで処理を進めておいて、前の処理で値を取得できるまで待機しておくという柔軟な処理を行うことが可能です。
もちろん並行した処理を行う性質上、レスポンスは高速になります。

高速エンジン「V8」

Node.jsはV8 JavaScriptエンジンに作られたプラットフォームです。このV8は、Googleが開発したオープンソースの実行エンジンであり、JavaScriptコードの即時コンパイルを行うことが可能です。
Google Chromeなどのブラウザにも採用されているものですが、これをJavaScriptでも適用できるようにしています。実行段階でコンパイルするため、中間コードも必要なく、結果的に処理を高速に行うことが可能になっています。
非同期処理に加えて高速エンジンであるV8を用いることで、高速さという特徴がブレない仕組みになっています。

シングルスレッド

Node.jsは、「シングルスレッド」方式を採用しています。
サーバには「シングルスレッド」「マルチスレッド」という概念があります。
一般的なサーバーは「マルチスレッド」と呼ばれる方式が採用されています。これは、サーバーに対するアクセスがあった場合に、複数のメモリを使用することで、アクセスにそれぞれメモリを付与することで処理をしていきます。大量にアクセスがあっても即座にメモリが割り当てられるため、それぞれのアクセスに対しての処理を高速に行うことが可能です。またこれにより、レスポンス・タイムの高速化を図ることができ、パフォーマンスの高い効果を発揮できます。

マルチスレッドを採用していなければ、重い通信などがどこかで発生した場合処理が止まってしまうため、他のアクセスに対してレスポンスが大幅に遅れるという問題点も起こりえます。
Node.jsはこのマルチスレッドではないため「遅いのか?」とも思われるかもしれませんが、実はそうではありません。

マルチスレッドにおいては、「C10K問題」と呼ばれる通信問題が起こりうる可能性があります。
アクセスを試みるクライアントの数がおよそ10000を越えた場合に、サーバーのスレッド数が増加し、メモリリソースが不足してしまいます。すると、サーバの処理能力にはまだ余裕があったとしてもメモリパンクが起こるがために、結果的にレスポンスが遅延するという事態が発生します。
つまりマルチスレッドでは、10000を超えたアクセスに対しては処理能力が高くても効率が悪化する可能性を孕んでいるわけなのです。

では、Node.jsの「シングルスレッド」はどうでしょうか?
シングルスレッドではメモリを割り振ることは無く、アクセス1つに対して1つの処理を行います。1つ1つ処理を行っていく都合上、メモリリソースが不足することはなく、メモリ効率が非常に良くなります。
「メモリは大丈夫だけれど、処理効率が悪いのでは?」と思うかもしれませんが、Node.jsでは問題ありません。

Node.jsでは非同期処理を行うことが可能です。そのため、1つのアクセスに対する処理が限りなく短く済むため、結果的には「メモリ効率よく」「高速で」処理を行うことが可能になっています。
「シングルスレッド」の短所を、Node.jsの特徴が見事にカバーをして、結果的に高速処理を達成することに成功しているのです。

強みの共通点

これらNode.jsの特徴を挙げましたが、その全てにおいて、「処理を高速に行う」ことに集約していることがわかります。
Node.jsを利用する最大の目的となりうる要素なのです。

Node.jsがよく使われるのは?

Node.jsの特徴が分かったところで、実際にどのような場面でよく使用されるのかを考えていきましょう。

WEBサービス開発

Node.jsが最も使われるのは「WEBサービス」における開発の現場でしょう。
特に、リアルタイム処理を求められるWEBサービスにおいて、よく用いられています。

「チャット」「動画配信」「SNS」など、我々の日常生活にも馴染み深い分野においてもリアルタイムの処理は欠かせないものであり、無くてはならないものとなっています。
またgoogleのスプレッドシートやテキストドキュメントなどは、リアルタイムでの更新が可能である点でイメージしやすいと思います。
リアルタイム処理を行うには、サーバからのレスポンスを動的にブラウザに反映する必要があります。Node.jsを使うことにより、動的な画面描画が可能になったのです。
「PayPal」のような決済サービスでも導入されています。

スマホアプリケーション

スマホアプリやソーシャルゲームなどでもNode.jsはよく使われています。特に多人数の同時接続が想定されるような場合に用いられることが多い印象です。
「シングルスレッド」による高速処理が可能で、大人数の同時接続処理もパフォーマンスを落とすことなく実行が可能というNode.jsの利点を存分に活かすことができる分野と言えるでしょう。
例えば、多人数が同時接続するゲームなどではシングルスレッドによる高速処理がいかんなく発揮されます。

どうしてNode.jsは使われるの? - Node.jsの利点 -

昨今のWEBサービスにおいて、処理の高速化は外すことのできないテーマとなっています。
どんなに優れたサービスであっても、どんなに汎用性のあるアプリケーションだったとしても、処理に時間がかかるというだけでユーザーは使用を控えてしまうことがあるためです。時間をかけてでも確実さを求める信用取引のようなものならともかく、WEBサービスやスマホアプリなどは「手軽さ」という利点があるため、処理の遅さによってその利点を消してしまっては、元も子もないわけです。
それだけ、ユーザー視点の開発ニーズが増しているという現状なのです。

さて前述の通り、Node.jsの強みとはすなわち「処理を高速に行うことができる」ことです。
Node.jsは、まさに処理の高速化が求められる昨今のニーズに応えることのできるプラットフォームとなっているのです。開発における選択肢としてはまず候補に挙げられる状態です。
またJavaScriptをある程度かければそのままNode.jsも書くことが可能なため、比較的学習コストも抑えることが可能です。
「昨今の開発ニーズに応えることができる」「比較的低コストで導入が見込める」という2点を兼ね備えたNode.jsが敬遠されるような理由は、特別な事情がない限りほぼ無いのです。