サーバサイドJavaScriptの本命「node.js」の基礎知識:node.jsでサーバサイドJavaScript開発入門(1)(1/3 ページ)
いま注目の「サーバサイドJavaScript」の実装の本命として話題を集める「Node.js」の概要から実践的な使い方まで解説する連載
いま注目の「サーバサイドJavaScript」
読者の皆さんは、Webアプリケーションを作成する際に、サーバサイドはどんなプログミラング言語をお使いですか? よく聞くのは、PHPやRuby、Perl、Java、ASP.NETなどの言語だと思います。一方でJavaScriptは、主にリッチなGUIを実装するためにクライアントサイドで使われるのが多かったかと思いますが、サーバサイドの開発でもJavaScriptが使えるのをご存じでしょうか。
「サーバサイドJavaScript」では、文字どおり、サーバサイドのアプリケーションの実装言語として、JavaScriptを使用します。JavaScriptをサーバサイドで使うことにより、クライアントサイドと同じ言語で開発でき、開発効率が上がることが期待されます。
最近では、JavaScriptエンジンにも、JITが搭載されるようになり、処理速度が格段に向上しました。もはやサーバサイドでよく使われている他の言語と遜色ないといえるでしょう。
さまざまな技術系メディアやブログでも、「今年はサーバサイドJavaScriptの年になるだろう」といわれていて、注目を集めています。「Node.js」は、そのサーバサイドJavaScriptの実装のうちの1つです。すでに日本のユーザーグループも活動しています。
本稿では、Node.jsの特徴や動作原理に触れ、サンプルや役に立つパッケージ、活用事例などを紹介したいと思います。
主なサーバサイドJavaScript
Node.jsに触れる前に、予備知識として他のサーバサイドJavaScriptにも触れておきます。Node.js含め、サーバサイドJavaScriptには、主に以下のようなプロジェクトがあります。
- Node.js
グーグルが開発したV8エンジン上で実行する環境 - Rhino
JavaVM上で実行するJavaScriptの言語処理系 - Aptana JaxerAptana社によって2008年1月からオープンソースライセンスで配布されている環境
サーバサイドJavaScripの標準仕様「CommonJS」とは
サーバサイドJavaScriptには、「CommonJS」と呼ばれる標準化が策定されています。標準化というと難しい感じがしますが、要はサーバサイドでJavaScriptを実行するのに何が必要かを仕様として、定義しているドキュメントのことです(例えば、「ログが必要だよね」など)。
Node.jsは、このCommonJSに則って開発されています。現段階であれば、CommonJSの仕様も非常にシンプルです。今後、サーバサイドJavaScriptの普及とともに仕様も成長していくと思われます。Node.jsと同様に、CommonJSの仕様も発展中です。今からサーバサイドJavaScriptを始めれば、CommonJSの仕様のバージョンアップとともにスキルアップできるかと思います。
サーバサイドJavaScriptの本命「Node.js」とは
Node.jsとは、サーバサイドJavaScriptの1つですが、「シングルスレッドベースの非同期処理環境」という特徴を持っています。
普通、非同期というと、サーバサイド側でマルチスレッドでのロジックを組むことを思い浮かべるかと思います。シングルスレッドでどうやって、非同期処理を行うかというと、「イベントループ」と呼ばれるアーキテクチャを用いて、非同期処理を行います。
イベントループイベントループ
このイベントループという技術は、C10K問題で有名になった技術です。インターネット上のWebサービスが普及し、たくさんのクライアントからのリクエストを処理するためには、どのようなアーキテクチャが効率的かが議論されました。
特にApacheとNginx(エンジンエックス)が例に挙げられて、イベントループのアーキテクチャの優位性について、論じられてきました。Apacheは、スレッドベースで動作するアーキテクチャになっており、Nginxは、イベントループで動作します。スレッドベースの場合、クライアントからのリクエストごとに対応するスレッドを作成します。その際、メモリも確保されるため、同時接続するクライアントの数に比例して、使用するメモリ量も増えていきます。
例えば、ニュースなどで話題になったWebサービスに一時的にアクセスが殺到したとき、つながらなくなることがよくありませんでしょうか? これは、まさしくサーバが瞬間的なアクセス増大に耐えきれなくなってしまうことにより、起こっています。かといって、いつブレイクするか分からないWebサービスのために、メモリ容量などのサーバリソースを余分に確保しておくのは、なかなか難しいことです。
この問題を解決するアーキテクチャとして、イベントループが開発されました。イベントループは、シングルスレッドで動作します。では、シングルスレッドで、複数クライアントからのリクエストにどう対応するのでしょうか。その答えは、「ノンブロッキングI/O」です。
ノンブロッキングI/O
ノンブロッキングI/Oとは、データの送受信(I/O)が完了を待たずに、他の処理を開始する処理方式のことです。非同期で処理が並列に実行されるため、ある処理の完了を待って、次の処理を行いたい場合は、コールバックを使用する必要があります。
つまり、イベントループとは、イベントが発生したタイミングでコールバックで呼び出される仕組みのことです。イベントループを使用すれば、スレッドは1つで済むため、メモリ使用率はクライアント数には比例しません。良いこと尽くめのアークテクチャのような気がしますが、デメリットももちろんあります。処理を必ずノンブロッキングで行わないといけないということです。もしブロックしてしまった場合、イベントループ全体の処理が止まってしまいます。
イベントループの実装は、「Twisted」(Python製)、「EventMachine」(Ruby製)など、いろいろありますが、PythonやRubyを使う場合、一緒に使うライブラリがブロックしないか注意が必要です。
その点Node.jsでは、記述言語としてJavaScriptを採用しています。マルチスレッドやブロッキングI/OをJavaScript自体が持っていないため、相性が良いといえます。
次ページからは、実際にNode.jsをインストールしてサンプルプログラムを作成してみましょう。
Copyright © ITmedia, Inc. All Rights Reserved.