#速さは正義!
やはり「最速」という言葉は胸を熱くするものがあります。
使うWebフレームワークのレスポンスが速ければ速いほど、ユーザービリティはよくなる上に、必要なサーバー台数も減らせるなど、いいことづくめです。
ただ、レスポンスの速さだけを追い求めて機能を削ったものは、開発の速度を遅くします。
Web開発に通常必要な機能は全て用意した上で、なお速い、そんな都合のいいフレームワークが求められます。
そこで、最近知った「revel」という「最速」にして「フルスタック」のWebフレームワークについて、調べたことを記載していきます。
今回は、
- 速さの計測方法解説
- revelの概要
- Go言語の概要
- revelのインストール・実行までの手順
などについて記載します。
※ ここで言っている「最速」とは、一秒間に何レスポンス返せるか、というような、ベンチマーク的な意味です。
※ ここで言っている「フルスタックWebフレームワーク」とは、テンプレート、データベース補助、ルーティングなど、Web開発に必要になるメジャーな機能を一通り全部そろえたフレームワーク、という意味です。
#速さの計測方法
「revel」が最速だとする根拠ですが、TechEmpowerというWeb開発会社が公開しているベンチマークをもとに判断しました。
何種類か計測結果があるのですが、私が主に注目したのは以下の2つのテストです。
どちらも、EC2の m1.large を使っています。
##テスト1:Jsonシリアライズ
オブジェクトをJSONにシリアライズして
{"message":"Hello, World!"}
とレスポンスを行う一連の流れを、一秒間に何回出来るか計測しています。
http://www.techempower.com/benchmarks/#section=data-r8&hw=ec2&test=json&c=1
##テスト2:DB値の複数行取得とJsonシリアライズ
複数行検索されるSELECTクエリをを実行してデータを取得し、JSONにシリアライズしてレスポンスを行う一連の流れを、一秒間に何回出来るか計測しています。
http://www.techempower.com/benchmarks/#section=data-r8&hw=ec2&test=query&c=1
##詳しい計測条件
もっと詳しい条件は以下に記載されています。
http://www.techempower.com/benchmarks/#section=code&hw=ec2&test=json&c=1
計測したフレームワークについては下記に一覧があります。
http://www.techempower.com/benchmarks/#section=environment&hw=i7&test=json
また、計測に使ったソースコードはGithubに公開されています。
https://github.com/TechEmpower/FrameworkBenchmarks
#計測結果解説
どちらも実はrevelではなく、「gemini」というWebサーバーが1位になってますが、これは計測を行ったTeckEmpowerさんの社内フレームワークで、公開もされてないらしいので、ノーカンです。
実質、今回紹介する「revel」が現時点の「最速」フルスタックWebフレームワークだと言えるでしょう。
その速さは凄まじく、例えばJSONシリアライズのほうだと、最大で秒間21920回(!?)のレスポンスをさばけ、
他のフレームワークと比べると、例えば
- Ruby on Railsと比べると約25倍
- CakePHPだと80倍、
- コンパイル言語で出来たSpring Frameworkと比べても4倍
という、なかなか衝撃の結果になっています。
#revelはどんなフレームワークか
revelは、Go言語で作られたWebフレームワークです。開発もGo言語で行います。
ホットリロードを備えているため、コンパイルのストレスなく開発でき、ルーティング、バリデーション、テンプレートエンジン、DB処理、テスト支援などの他、様々な機能を備えています。
サーバーや、プロジェクトの作成機能なども含めて全てセットになっており、
revel new myapp
revel run myapp
などとするとすぐひな形が作られ、動きます。
ちなみにJava、Scala界隈で最近人気のPlay Frameworkを参考にして作られており、機能も大体同じみたいです。
#Go言語とは
Google製の比較的最近できたプログラム言語です。
- 非常にシンプルな言語で覚えやすく
- コンパイルも早く
- C言語並みの速度を持ち
- 同期処理が書きやすい
などの特徴があります。
速さと開発のしやすさの両立を目指してできた言語みたいですね。
色々とくせはありますが、確かにシンプルで覚えやすい言語な気はします。
まだ勉強したてですが。
ただ、開発にはEclipseのプラグインなどもありますが、まだまだ整備はされていない印象は受けます。
#Go言語のインストール
Macにインストールしました。
brew update
brew install go
brew install mercurial
↑go言語のライブラリで mercurialというのを使っているらしいのでいれる
vi .bash_profile
でエディタを開き
export GOROOT=`go env GOROOT`
export GOPATH=$HOME/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
を記載してパスを通す。
保存して再読み込み。
source .bash_profile
#revelのインストール
go get github.com/robfig/revel
↑revel本体のインストール
go get github.com/robfig/revel/revel
↑revelコマンドラインツールのインストール?
#revelのサンプルアプリ実行
設定したGOPATH(~/go)に、revelのサンプルアプリがダウンロードされているはずなので、
実行してみます。
cd $GOPATH/src
revel run github.com/robfig/revel/samples/booking
これで
http://localhost:9000/
にアクセスして
「revel framework booking demo」
などと表示されればOK。
#revelのアプリ新規作成
どうにも、アプリのソースは
$GOPATH/src
配下にしなければいけないらしいです。
ソースがかぶってしまわないように、適切なディレクトリを切る必要があります。
とりあえずこんな感じで作成して起動してみます。
cd $GOPATH/src
revel new github.com/myname/test/myapp
revel run github.com/myname/test/myapp
http://localhost:9000/
にアクセスして
「It Works」
などと表示されればOK。