Upload
yuji-otani
View
6.006
Download
0
Embed Size (px)
Citation preview
フレームワーク Revelの紹介と
サービスにおける活用事例
株式会社インテリジェンス大谷 祐司
1
2015/08/11
2
・山口県下関出身の 34 歳・インテリジェンスの新規事業 (MIIDAS)の技術責任者。
・企画からアプリ、インフラまで幅広くやっています。
・車とプログラミングを愛しています。
・土日は育児しながら勉強しています。
・ Facebookの友達申請は気軽にぜひ! https://www.facebook.com/yuji.otani.16
自己紹介
3
Amazonでの Tシャツ購入は
早くも3枚目になりました。
4
5年 7年8ヶ月
→ →
メイン開発言語の経歴
5
最近注目されている Go言語。
採用実績も増えています。
インテリジェンス社内でフレームワーク
Revelを利用していますので、特徴と合わ
せてご紹介します。
勉強会の内容
6
会場の皆さんに質問です。
7
質問①
Revelを実際に触ったことがあるかた
8
質問②
Revelを業務で使っているかた
9
Revelの紹介
10
・ Java/Scalaで人気の play frameworkを参考に
作られた Go言語のMVCフレームワーク。
・機能が豊富で「フルスタック」である。
11
・Web アプリケーションに必要な機能が揃っている。
・コマンドでスケルトンの作成やアプリケーションの
起動を行う事ができる。
・コードを編集すると自動的にコンパイルを実行できる。
・ devモードの実行が可能で、デバッグを簡単に行える。
Revelの特徴
12
Revelとはどういう意味?
・酒盛り
・お祭り騒ぎ
・飲んで浮かれる
13
go getコマンドで簡単にインストール
→revelコマンドが利用できるようになる。
go get github.com/revel/revel
go get github.com/revel/cmd/revel
インストール方法
14
・ revel new : アプリケーションのスケルトン生成
・ revel run :テスト用にアプリケーション起動
・ revel build:同一サーバへのビルド
Revel6つのコマンド
15
・ revel package:デプロイ用のパッケージ作成
・ revel clean :一時ファイルの削除
・ revel test :テストを実行する
Revel6つのコマンド
16
Revelで提供されている機能
17
ルーティング
リクエストパラメータのパース
バリデーション
セッション管理
Viewのテンプレート
キャッシュ (Redis/memcached)
主な機能
18
ジョブ実行
テストフレームワーク
言語の国際化対応
Config(dev/prd)→stgとか追加可能
ロギング
Profiler
Csrf(要プラグイン )
主な機能
19
サイバーエージェント社が Ameba Owndで採用。
『 Ameba Ownd』では、 Revelと Gorilla web toolkit の 2
つを比較検討し、結果的に Revelを採用しました。 Revel
“ ”の方が お作法 が決まっていて、スムーズに書くことがで
きると感じたためです。
http://engineer.typemag.jp/article/amebaownd
採用事例
20
Talknote社が自社の SNSで採用。
選定理由
・開発が活発で多くの人に使われていること ・他言語と同様のパラダイムで設計されたWAFであるこ
と
・応答速度が速い
採用事例
21
インテリジェンスにおける
Revelの活用事例
22
先月リリースされた転職サイトで、
初めて Go言語を採用しました。
Web開発言語 : Hack(hhvm3.7)
フレームワーク : FuelPHP1.7
バッチ開発言語 : Go言語 1.4
OS : CentOS7
Webサーバ : nginx1.9
DB :
MariaDB10.0
インフラ管理 : Ansible
採用している技術
23
24
・データ連携 /集計、 KPIアラートなどのバッチ
・ Goをコンパイルして Hackから呼び出す
・サービス管理用のツール (Revel)
Go言語を利用している部分
25
バッチが多く、かつ処理が複雑になりそうだった。
並列処理を活用する場面が多そうだった。
高いパフォーマンスと並列処理の仕組みがある。
Go言語を選択した理由
26
最低限の機能で開発してから機能追加していく初期リリース時には最低限のテストコードのみを書く
メンテナンスやリファクタリングしやすい特徴か
ら、
コンパイル言語が合っていると判断。
Go言語を選択した理由
27
これからメジャーになっていく言語だという確信。
PHPerが習得しやすい言語だという話を聞く。
周りの Gopherがみんな楽しそう。
Goを採用して、チームのチャレンジ意識を高めたい。
Go言語を選択した理由
28
①「フルスタック」のフレームワークなので、 Go言語で開発するお作法を学ぶのに役立て
たい。
② 初めてということで、とりあえずメジャーなフレームワークを押さえておきたかった。
Revelを選択した理由
29
本番Webサーバの構成
・ nginxをフロントにして proxy_passで動作
・リクエストによって Hack/Revelを切り替え
Internet
9001
9000
30
工夫ポイント
ORMには Gormを採用。
パフォーマンス < スマートなコード
Revelのサンプルには Gorpが使われていますが、
スマートにコーディングできて多機能な Gorm
を使っています。
31
工夫ポイント
標準の Viewテンプレートが多機能とは言えない
ので、独自に funcを定義して使っています。
revel.TemplateFuncsに init()で渡す事により、
アプリケーション独自の関数が作成可能です。
32
View周りの情報がとても少ないです。
癖のあるテンプレートエンジン・・・
selectboxに初期選択値を設定できずに
ハマりました。
ハマりポイント
33
teratailで初めて質問するが、回答がつかず
に凹みます・・・
34
なんとかチーム内で解決しましたが、ハマ
ると本当に厄介です。。
35
まとめ
Revelはとても「楽しみながら」開発できるフレー
ムワークです。機能が豊富で Go言語の理解を深め
ることができると思います。
今後は Revelを利用したWebサービスも開発予定。
どんどん活用していきたいと思っています。
36
おまけ
Go言語開発における
パフォーマンス改善事例
37
事例①:データ集計バッチ
もともと ORマッパ (Gorm)を利用してい
たバッチにおいて、パフォーマンス改善
した事例をご紹介します。
38
実際のベンチマーク例
・3万レコードをテーブル Aから取得
・特定の加工処理を行う。
・テーブル Bに加工後のレコードを insert
Goバッチシステム
DB
システム
DB
39
実際のベンチマーク例
ORM(Gorm)の利用 14.7秒
Goバッチシステム
DB
システム
DB
1.4秒 13.3秒
40
実際のベンチマーク例
直接 SQL実行 (1件毎の insert) 9.3秒
Goバッチシステム
DB
システム
DB
1.0秒 8.3秒
41
実際のベンチマーク例
直接 SQL実行 (1000件毎の insert) 5.8秒
Goバッチシステム
DB
システム
DB
1.0秒 4.8秒
42
ORM→直接 SQLを実行に切り替えることで、
約 3倍のパフォーマンスを改善しました。
43
事例②:文字列の連結
あまり考えず文字列連結をしていましたが、
工夫することで大幅なパフォーマンス UP
を
実現することができました。
44
1から 1000万までを文字列として連結
し
ファイルに出力
計測してみました
45
1から 1000万までを文字列として連結しファイルに出
力
実際のベンチマーク例
data := ""
for i := 1; i <= 10000000; i++ {
data += strconv.Itoa(i)
}
content := []byte(data)
ioutil.WriteFile("exportgo.txt", content,
os.ModePerm)
文字列連結: 10分以上・・・
46
1から 1000万までを文字列として連結しファイルに出
力
実際のベンチマーク例
var buffer bytes.Buffer
for i := 1; i <= 10000000; i++ {
buffer.WriteString(strconv.Itoa(i))
}
content := []byte(buffer.String())
ioutil.WriteFile("exportgo.txt", content, os.ModePerm)
bytes.Bufferを利用: 0.95秒
47
大量の文字列の連結には bytes.Buffer
を活用すべし!!
「 +」での連結は非常に遅いです・・
48
本日の内容は以上になります。
49
インテリジェンスでは、 Go言語を採用したプロ
ジェクトが複数立ち上がっています。
エンジニアを募集していますので、興味ある方は
お声がけください!
50
ご静聴ありがとうございました。