go言語のフレームワークrevelの紹介とサービスにおける活用事例

50
フフフフフフフ Revel フフフフ フフフフフフフフフフフフ フフフフフフフフフフフフ フフ フフ 1 2015/08/11

Upload: yuji-otani

Post on 14-Apr-2017

6.006 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Go言語のフレームワークRevelの紹介とサービスにおける活用事例

フレームワーク Revelの紹介と

サービスにおける活用事例

株式会社インテリジェンス大谷 祐司

1

2015/08/11

Page 2: Go言語のフレームワークRevelの紹介とサービスにおける活用事例

2

・山口県下関出身の 34 歳・インテリジェンスの新規事業 (MIIDAS)の技術責任者。

・企画からアプリ、インフラまで幅広くやっています。

・車とプログラミングを愛しています。

・土日は育児しながら勉強しています。

・ Facebookの友達申請は気軽にぜひ!  https://www.facebook.com/yuji.otani.16

自己紹介

Page 3: Go言語のフレームワークRevelの紹介とサービスにおける活用事例

3

Amazonでの Tシャツ購入は

早くも3枚目になりました。

Page 4: Go言語のフレームワークRevelの紹介とサービスにおける活用事例

4

5年 7年8ヶ月

→ →

メイン開発言語の経歴

Page 5: Go言語のフレームワークRevelの紹介とサービスにおける活用事例

5

最近注目されている Go言語。

採用実績も増えています。

インテリジェンス社内でフレームワーク

Revelを利用していますので、特徴と合わ

せてご紹介します。

勉強会の内容

Page 6: Go言語のフレームワークRevelの紹介とサービスにおける活用事例

6

会場の皆さんに質問です。

Page 7: Go言語のフレームワークRevelの紹介とサービスにおける活用事例

7

質問①

Revelを実際に触ったことがあるかた

Page 8: Go言語のフレームワークRevelの紹介とサービスにおける活用事例

8

質問②

Revelを業務で使っているかた

Page 9: Go言語のフレームワークRevelの紹介とサービスにおける活用事例

9

Revelの紹介

Page 10: Go言語のフレームワークRevelの紹介とサービスにおける活用事例

10

・ Java/Scalaで人気の play frameworkを参考に

作られた Go言語のMVCフレームワーク。

・機能が豊富で「フルスタック」である。

Page 11: Go言語のフレームワークRevelの紹介とサービスにおける活用事例

11

・Web  アプリケーションに必要な機能が揃っている。

・コマンドでスケルトンの作成やアプリケーションの

  起動を行う事ができる。

・コードを編集すると自動的にコンパイルを実行できる。

・ devモードの実行が可能で、デバッグを簡単に行える。

Revelの特徴

Page 12: Go言語のフレームワークRevelの紹介とサービスにおける活用事例

12

Revelとはどういう意味?

・酒盛り

・お祭り騒ぎ

・飲んで浮かれる

Page 13: Go言語のフレームワークRevelの紹介とサービスにおける活用事例

13

go getコマンドで簡単にインストール

→revelコマンドが利用できるようになる。

go get github.com/revel/revel

go get github.com/revel/cmd/revel

インストール方法

Page 14: Go言語のフレームワークRevelの紹介とサービスにおける活用事例

14

・ revel new : アプリケーションのスケルトン生成

・ revel run :テスト用にアプリケーション起動

・ revel build:同一サーバへのビルド

Revel6つのコマンド

Page 15: Go言語のフレームワークRevelの紹介とサービスにおける活用事例

15

・ revel package:デプロイ用のパッケージ作成

・ revel clean :一時ファイルの削除

・ revel test :テストを実行する

Revel6つのコマンド

Page 16: Go言語のフレームワークRevelの紹介とサービスにおける活用事例

16

Revelで提供されている機能

Page 17: Go言語のフレームワークRevelの紹介とサービスにおける活用事例

17

ルーティング

リクエストパラメータのパース

バリデーション

セッション管理

Viewのテンプレート

キャッシュ (Redis/memcached)

主な機能

Page 18: Go言語のフレームワークRevelの紹介とサービスにおける活用事例

18

ジョブ実行

テストフレームワーク

言語の国際化対応

Config(dev/prd)→stgとか追加可能

ロギング

Profiler

Csrf(要プラグイン )

主な機能

Page 19: Go言語のフレームワークRevelの紹介とサービスにおける活用事例

19

サイバーエージェント社が Ameba Owndで採用。

『 Ameba Ownd』では、 Revelと Gorilla web toolkit の 2

つを比較検討し、結果的に Revelを採用しました。 Revel

“ ”の方が お作法 が決まっていて、スムーズに書くことがで

きると感じたためです。

http://engineer.typemag.jp/article/amebaownd

採用事例

Page 20: Go言語のフレームワークRevelの紹介とサービスにおける活用事例

20

Talknote社が自社の SNSで採用。

選定理由

  ・開発が活発で多くの人に使われていること  ・他言語と同様のパラダイムで設計されたWAFであるこ

  ・応答速度が速い

採用事例

Page 21: Go言語のフレームワークRevelの紹介とサービスにおける活用事例

21

インテリジェンスにおける

Revelの活用事例

Page 22: Go言語のフレームワークRevelの紹介とサービスにおける活用事例

22

先月リリースされた転職サイトで、

初めて Go言語を採用しました。

Page 23: Go言語のフレームワークRevelの紹介とサービスにおける活用事例

Web開発言語 : Hack(hhvm3.7)

フレームワーク : FuelPHP1.7

バッチ開発言語 : Go言語 1.4

OS : CentOS7

Webサーバ : nginx1.9

DB :

MariaDB10.0

インフラ管理 : Ansible

採用している技術

23

Page 24: Go言語のフレームワークRevelの紹介とサービスにおける活用事例

24

・データ連携 /集計、 KPIアラートなどのバッチ

・ Goをコンパイルして Hackから呼び出す

・サービス管理用のツール (Revel)

Go言語を利用している部分

Page 25: Go言語のフレームワークRevelの紹介とサービスにおける活用事例

25

バッチが多く、かつ処理が複雑になりそうだった。

並列処理を活用する場面が多そうだった。

高いパフォーマンスと並列処理の仕組みがある。

Go言語を選択した理由

Page 26: Go言語のフレームワークRevelの紹介とサービスにおける活用事例

26

最低限の機能で開発してから機能追加していく初期リリース時には最低限のテストコードのみを書く

メンテナンスやリファクタリングしやすい特徴か

ら、

コンパイル言語が合っていると判断。

Go言語を選択した理由

Page 27: Go言語のフレームワークRevelの紹介とサービスにおける活用事例

27

これからメジャーになっていく言語だという確信。

PHPerが習得しやすい言語だという話を聞く。

周りの Gopherがみんな楽しそう。

Goを採用して、チームのチャレンジ意識を高めたい。

Go言語を選択した理由

Page 28: Go言語のフレームワークRevelの紹介とサービスにおける活用事例

28

①「フルスタック」のフレームワークなので、 Go言語で開発するお作法を学ぶのに役立て

たい。

② 初めてということで、とりあえずメジャーなフレームワークを押さえておきたかった。

Revelを選択した理由

Page 29: Go言語のフレームワークRevelの紹介とサービスにおける活用事例

29

本番Webサーバの構成

・ nginxをフロントにして proxy_passで動作

・リクエストによって Hack/Revelを切り替え

Internet

9001

9000

Page 30: Go言語のフレームワークRevelの紹介とサービスにおける活用事例

30

工夫ポイント

ORMには Gormを採用。

 パフォーマンス < スマートなコード

Revelのサンプルには Gorpが使われていますが、

スマートにコーディングできて多機能な Gorm

を使っています。

Page 31: Go言語のフレームワークRevelの紹介とサービスにおける活用事例

31

工夫ポイント

標準の Viewテンプレートが多機能とは言えない

ので、独自に funcを定義して使っています。

revel.TemplateFuncsに init()で渡す事により、

アプリケーション独自の関数が作成可能です。

Page 32: Go言語のフレームワークRevelの紹介とサービスにおける活用事例

32

View周りの情報がとても少ないです。

癖のあるテンプレートエンジン・・・

selectboxに初期選択値を設定できずに

ハマりました。

ハマりポイント

Page 33: Go言語のフレームワークRevelの紹介とサービスにおける活用事例

33

teratailで初めて質問するが、回答がつかず

に凹みます・・・

Page 34: Go言語のフレームワークRevelの紹介とサービスにおける活用事例

34

なんとかチーム内で解決しましたが、ハマ

ると本当に厄介です。。

Page 35: Go言語のフレームワークRevelの紹介とサービスにおける活用事例

35

まとめ

Revelはとても「楽しみながら」開発できるフレー

ムワークです。機能が豊富で Go言語の理解を深め

ることができると思います。

今後は Revelを利用したWebサービスも開発予定。

どんどん活用していきたいと思っています。

Page 36: Go言語のフレームワークRevelの紹介とサービスにおける活用事例

36

おまけ

Go言語開発における

パフォーマンス改善事例

Page 37: Go言語のフレームワークRevelの紹介とサービスにおける活用事例

37

事例①:データ集計バッチ

もともと ORマッパ (Gorm)を利用してい

たバッチにおいて、パフォーマンス改善

した事例をご紹介します。

Page 38: Go言語のフレームワークRevelの紹介とサービスにおける活用事例

38

実際のベンチマーク例

・3万レコードをテーブル Aから取得

・特定の加工処理を行う。

・テーブル Bに加工後のレコードを insert

Goバッチシステム

DB

システム

DB

Page 39: Go言語のフレームワークRevelの紹介とサービスにおける活用事例

39

実際のベンチマーク例

ORM(Gorm)の利用  14.7秒

Goバッチシステム

DB

システム

DB

1.4秒 13.3秒

Page 40: Go言語のフレームワークRevelの紹介とサービスにおける活用事例

40

実際のベンチマーク例

直接 SQL実行 (1件毎の insert)  9.3秒

Goバッチシステム

DB

システム

DB

1.0秒 8.3秒

Page 41: Go言語のフレームワークRevelの紹介とサービスにおける活用事例

41

実際のベンチマーク例

直接 SQL実行 (1000件毎の insert)  5.8秒

Goバッチシステム

DB

システム

DB

1.0秒 4.8秒

Page 42: Go言語のフレームワークRevelの紹介とサービスにおける活用事例

42

ORM→直接 SQLを実行に切り替えることで、

約 3倍のパフォーマンスを改善しました。

Page 43: Go言語のフレームワークRevelの紹介とサービスにおける活用事例

43

事例②:文字列の連結

あまり考えず文字列連結をしていましたが、

工夫することで大幅なパフォーマンス UP

実現することができました。

Page 44: Go言語のフレームワークRevelの紹介とサービスにおける活用事例

44

1から 1000万までを文字列として連結

ファイルに出力

計測してみました

Page 45: Go言語のフレームワークRevelの紹介とサービスにおける活用事例

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分以上・・・

Page 46: Go言語のフレームワークRevelの紹介とサービスにおける活用事例

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秒

Page 47: Go言語のフレームワークRevelの紹介とサービスにおける活用事例

47

大量の文字列の連結には bytes.Buffer

を活用すべし!!

「 +」での連結は非常に遅いです・・

Page 48: Go言語のフレームワークRevelの紹介とサービスにおける活用事例

48

本日の内容は以上になります。

Page 49: Go言語のフレームワークRevelの紹介とサービスにおける活用事例

49

インテリジェンスでは、 Go言語を採用したプロ

ジェクトが複数立ち上がっています。

エンジニアを募集していますので、興味ある方は

お声がけください!

Page 50: Go言語のフレームワークRevelの紹介とサービスにおける活用事例

50

ご静聴ありがとうございました。