gihyo.jp×東京Node学園祭2011コラボ企画―「東京Node学園祭2011」の見どころ教えます!

第2回 Node.js の過去,現在,未来

この記事を読むのに必要な時間:およそ 4 分

はじめに

Node.jsは「サーバサイド JavaScript」環境として,近年のブラウザ上で動作するクライアントサイドJavaScriptの盛り上がりに合わせて,急速に注目を集めています。日本においても,Node.js日本ユーザグループ の登録者はすでに800人を超えており,さまざまなブログや技術系サイトで取り上げられたり,雑誌に記事が掲載されたり,実際のサービスで利用が開始されるなど,大きな盛り上がりを見せています。そうした盛り上がりがある一方で,新しく立ち上がった技術に対してよく聞かれる疑問である,⁠Node.jsって何?」とか「サーバサイドでJavaScriptが書けるってどういうこと?」といった声も多く聞かれるようになってきました。

そこで第2回目の本記事ではそれらの疑問に答えるべく,Node.jsの過去,現在,そして未来について解説していきます。

Node.js の過去

Node.js の目指しているもの

Node.jsの公式サイトには,⁠Nodeの目指すものは,スケールするネットワークプログラムを構築する簡単な方法を提供すること(Node's goal is to provide an easy way to build scalable network programs)⁠とあります。つまり,Node.jsは「大量のアクセス」「簡単かつ高速」に処理できるネットワークプログラミング環境を目指していると言えます。標準ライブラリにHTTPを中心としたネットワークライブラリが含まれているのも,公式サイトのトップページのサンプルコードが簡易HTTPサーバを作るコードであるのも,このゴールを意識しているからに他なりません。

Node.js が生まれた背景,および JavaScript が選択された理由

それではなぜNode.jsが「大量のアクセス」「簡単かつ高速」に捌くことのできる環境を目指しているのかというと,それはNode.js の開発が開始された2009年頃に遡ります。

その当時,ネットワークトラフィックの急激な増加に伴いC10K問題が大きくクローズアップされており,大量のコネクションをどのように高速に処理するか,ということについてさまざまな議論が交わされていました。Apacheなどが採用するコネクションごとにスレッドを立ち上げて処理する「スレッドモデル」方式ではマシンリソースを大量に消費してしまい,処理速度の低下やサーバの台数を多くしなくてはいけないなどの問題が発生していました。Node.jsの作者であるRyan Dahlはこの問題を解決するために,NGINXなどが採用している「イベントループ」方式を採用し,その方式に最適化されたプログラミング環境を構築することを決断しました。それがNode.jsです。

「イベントループ」とは簡単に言ってしまえば,シングルスレッドでループ処理をまわし,キューに溜まったイベントを処理していく処理方式です。

このイベントループ方式を採用したプログラミング環境は他の言語でもすでに存在しています。たとえば,RubyのEventMachineやPythonのTwistedなどです。ただし,それらの環境には大きな問題が存在しています。それは既存のライブラリがイベントループを意識して作られていないため,既存のライブラリを利用しようとすると途端に処理がブロックしてしまうということです。前述のようにイベントループはシングルスレッドで処理されるので,1つの処理がスレッドをブロックしてしまうと,次のイベントが処理されず,⁠少量のリソースで高速に処理できる」というメリットが失われてしまいます。また,それを回避しようとすると,既存のライブラリが利用できないため,新規ライブラリを作成する必要があり,途端にプログラミングが難しくなってしまうと問題がありました。これではNode.jsの目指す「簡単かつ高速」なプログラミング環境を実現できません。イベントループを最大限に活かすためには,すべてがNon-Blockingである必要があるのです。そこで,Ryanはイベントループ,そしてNon-Blockingに適した言語としてJavaScriptを選択する決断をしました。JavaScriptが選択された理由は主に以下の3点です。

  • マルチスレッドで動作することが前提にない言語であり,イベントループと相性が良かった
  • 標準のI/Oライブラリが存在しなかったため,Non-blocking I/Oを強制するライブラリ群をゼロから自由に構築することができた
  • Googleが開発している高速なJavaScriptエンジンであるV8がオープンソースとして公開されており,開発当時(2009年)から実用的な速度で動作させることが可能であった

Node.jsはサーバーサイドでもJavaScriptでプログラミングできることで取り上げられることが多いですが,実はJavaScriptを言語として利用したいという理由で作成されたわけではなく,目的とするプログラミング環境を構築するのにJavaScriptが最適であったからである,というのはとても興味深い事実です。

この辺りの経緯については,Ryan本人が語っている動画や,@bad_at_mathさんのnode.js とは何かでより詳しく解説されているので興味のあるかたはご覧になってみてください。

Node.jsの現在

Node.js の普及

「Node.js の過去」では,Node.jsはC10K問題を解決するためイベントループ方式を採用し,Non-blocking I/Oを標準ライブラリとして持ち, JavaScriptで「大量のアクセス」「簡単かつ高速」にプログラムすることのできる環境である,ということを説明しました。しかし,ここ最近のNode.jsの普及,爆発的な盛り上がりは,こうした根源的な思想への共感の他に,大きく分けて2つの理由があります。1つは「JavaScript でサーバサイドのプログラムも組める」こと,そしてもう1つが「Socket.IO」です。

JavaScriptでサーバサイドのプログラムも組める

Webに関係するエンジニアならば,JavaScriptは何らかの形で書いたことがあるでしょう。そのため,Node.jsは初期の言語学習コストが低く,心理的な障壁も低いために,ここまで話題を集め,盛り上がりを見せているのではないでしょうか。実際にNode.js日本ユーザグループに参加しているエンジニアの背景もさまざまで,Java,Ruby, Python, Perlなどのサーバサイドエンジニアの方の他に,それまでサーバサイドのコードを書いたことなかったフロントエンジニアの方やデザイナの方なども参加しているのが特徴です。これ以外にも,JavaScriptがプロトタイプベースの非常に強力な言語であること,クライアントとサーバで同じ言語が使えて開発効率が良いこと,JSONベースのデータストアであるMongoDBなどを利用することでデータのインピーダンスミスマッチを考えなくても良いこと,などがNode.jsでプログラミングする魅力となっています。また,既存のクライアントサイドのJavaScriptライブラリが使えることもNode.jsの特徴です。

たとえば,Node.jsでは,jsdomというライブラリを利用することで,jQueryを使ったスクリーンスクレイピングのアプリを以下のように簡単に記述することができます。

// npm モジュール request, jsdom を利用
var request = require('request')
  , jsdom = require('jsdom');

// 指定した URL の <title> タグの中身を表示するサンプル
request('http://nodefest.jp', function(error, response, body) {
  if (!error && response.statusCode !== 200) {
    console.log('Error!');
    return false;
  }
  jsdom.env({
    html: body,
    scripts: [
      'http://code.jquery.com/jquery-1.6.4.min.js'
    ]
  }, function(err, window) {
    var $ = window.jQuery;
    console.log($('title').html());
  });
});

著者プロフィール

本多一行(ほんだかずゆき)

エムスリー株式会社勤務。

日本アイ・ビー・エムで5年間勤務した後,Web業界に憧れて2009年2月より現職。Node.jsは実際の業務で使う傍ら,趣味でKinectとつなげて遊んだりしている。npmモジュールとしてKinectバインディングMeCabバインディングを公開中。

Twitter:hakobera

ブログ:Scalaとlift のはずだった・・・

コメント

コメントの記入