Go
framework
benchmark
Revel

「最速」フルスタックWebフレームワーク「revel」の紹介

More than 1 year has passed since last update.

速さは正義!

やはり「最速」という言葉は胸を熱くするものがあります。
使うWebフレームワークのレスポンスが速ければ速いほど、ユーザービリティはよくなる上に、必要なサーバー台数も減らせるなど、いいことづくめです。

ただ、レスポンスの速さだけを追い求めて機能を削ったものは、開発の速度を遅くします。
Web開発に通常必要な機能は全て用意した上で、なお速い、そんな都合のいいフレームワークが求められます。

そこで、最近知った「revel」という「最速」にして「フルスタック」のWebフレームワークについて、調べたことを記載していきます。

20130929131800.jpg

今回は、

  • 速さの計測方法解説
  • 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言語で行います。

↓本家
http://revel.github.io/

ホットリロードを備えているため、コンパイルのストレスなく開発でき、ルーティング、バリデーション、テンプレートエンジン、DB処理、テスト支援などの他、様々な機能を備えています。

サーバーや、プロジェクトの作成機能なども含めて全てセットになっており、

revel new myapp
revel run myapp

などとするとすぐひな形が作られ、動きます。

ちなみにJava、Scala界隈で最近人気のPlay Frameworkを参考にして作られており、機能も大体同じみたいです。

Go言語とは

Google製の比較的最近できたプログラム言語です。

↓本家
http://golang.org/

  • 非常にシンプルな言語で覚えやすく
  • コンパイルも早く
  • 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。