Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

7,985 views

Published on

2015年8月15日のGo言語勉強会で発表した資料です。Go言語のフレームワークRevelの紹介とサービスにおける活用事例についての内容になります。

Published in: Technology
  • Be the first to comment

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

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

×