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

Post on 14-Apr-2017

6.006 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

フレームワーク 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

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

top related