CA Wise

Tech Blog

Tech Blogトップに戻る

CAリワード × iXam Go勉強会

2017.04.26

  • このエントリーをはてなブックマークに追加
  • Pocket
kotaking
kotakingエンジニア

CAリワードとグループ会社のiXam合同で、LT形式のGo勉強会を実施しました。今回は勉強会の様子と発表内容についてご紹介していきたいと思います。

iXam 杉澤

945bc3aa-239f-11e7-82fc-e6e0cec6cd7a.JPG

テーマ

  • iXamチームのGo
Go導入実績
  • 2016年8月 chatopsとして導入
  • 2016年11月 レポートデータから最適な予算を導きだすシステム構築
  • 2017年2月 クライアントデータ等を提供するプロダクトリニューアル

現在、プロダクトリニューアルの開発が進行中

Go言語を使っているところ
  • SPAのAPI処理
  • バッチ処理
  • chatops
使用ライブラリ
  • Webアプリのフレームワーク:labstack/echo
  • ORM(mysql):gocraft/dbr
  • cache(redis):chasex/redis-go-cluster
  • CSV I/O:gocarina/gocsv
  • Testing:Go標準
  • vendoring:kardianos/govendor
  • タスクランナー:make
  • ローカル開発環境:minikube(kubernetes) on alpine

GoでMVCモデルのサービスを作る上で、全体の見通しをよくしつつ、どのパッケージをどこに配置するか迷わないで済むよう、各コントローラー、モデル、サービス、ビューに命名・配置ルールを設け、実装した話をしていただきました。
構成ルールを決めたことにより、プロジェクトメンバー全員がどこに書いたらいい?パッケージ名は?など迷わなくなり、開発・コードレビューもスムーズに進むようになったようです。


CAリワード 山塚

9464561e-239f-11e7-8092-581c5e0658c9.JPG

テーマ

  • 現在のプロジェクトとGolang
  • Golang で tail -f

内容

CAリワードの不正対策チーム(BOSATSU)でリードエンジニアを務める山塚が発表したのは、BOSATSUプロジェクトで使われているGo+関連技術の紹介と、アプリケーションのログから特定の文字をtail -f のような形で検知するためのライブラリの紹介、それぞれのツールがどのように実装されているのかを解説してくれました。

Goでtailの機能を使う際の選択肢

hpcloud/tail サンプルコード

Git starの多いhpcloud/tail で実装を試みました

どうやってファイルの変更を検知しているのか ?

hpcloud/tail内部ではfsnotifyのライブラリが使われていて、fsnotifyが各イベントを監視〜通知しているようです。

https://github.com/fsnotify/fsnotify

Watcherが各イベントを監視

  • Create
  • Write
  • Remove
  • Rename
  • Chmod

fsnotifyは異なるOSでもきちんとイベントをキャッチしてくれます。その理由は、各イベントのメソッドの中で、OSに応じてシステムコールを使い分けているようです。

624a366a-2612-11e7-8599-809e9587f202.png

参考


iXam 水沼

197e1162-25b9-11e7-8acf-135cb9a7ec2b.JPG

テーマ

  • オペテクにおけるGoの利用

内容

主にオペテクにおけるGo導入の話をしてくれました。 最近のプロジェクトを見ると、今までJavaだったものが一気にGoに置き換わっているので、Go導入スピードの早さが伺えました。

  • 最近のプロジェクト
    • 2015.10 ~ iXamCreativeLab新規開発(Java)
    • 2016.03 ~ iXamCube新規開発(Java)
    • 2016.06 ~ クリラボ機能追加&リプレイス (Go)
    • 2016.06 ~ アロケーションシステム新規開発(Go)
    • 2017.02 ~ iXamMother新規開発(Go)
    • 2017.0x ~ チェックバックツール新規開発(Go)
  • 使用しているツール/ライブラリ
    • Docker - IntelliJ IDEA + golang-idea-plugin
    • go-godo/godo
    • Web Framework(Echo v2 → v3)
    • gocraft/dbr v2
    • smartystreets/go-convey
    • benmans/goworker

CAリワード 辻

9488cab2-239f-11e7-86f1-e68b74d993c6.JPG

テーマ

  • GVA(GratefulVideoAd)におけるgolang導入事例とtips

CAリワードのインセンティブ型動画広 GVA(GratefulVideoAd)におけるGo導入事例とGoのtipsについて紹介です。
GVAではさまざまな技術を取り入れ、安定したサービスがどのような仕組みで動いているのか説明していただきました。

GVAにおけるgolang導入事例

Messaging patterns for Event-Driven Microservices

Cloud Pub/Subを使った 非同期メッセージ(イベント)駆動、Microsevicesな構成のアーキテクチャになっていて、それぞれのserviceがGKE Cluster上に配置され、pod単位で独立してスケール IN/OUT alpine + golangで軽量かつ立ち上がりも速いようです。

▼構成図(イメージ)

6ad0e2b8-25b6-11e7-83c5-672fdc6998d6.png

また、それ以外にもGCPマネージドやそれ以外のミドルを色々使われていて、GVAで使われている技術・ミドルを紹介していただきました。

▼GVAで使われている技術・ミドルなど

78713368-23a5-11e7-9b36-5c3141d6d75c.png

Go tips

tipsではGo1.7から1.8へのバージョンアップについて紹介してくれました。

  • performance
  • GC改善
  • defer呼出のオーバヘッド改善
  • bytes、encording/xxx、regexp、reflectなど低レベルな処理改善
  • 1.7.3 vs 1.8で幾つかベンチマークを取った所、平均して約13%改善。
  • sort.Slice
  • lessの処理をコールバック関数で渡せる。Sorterインターフェイスを実装が不要に
  • context 適用拡大
  • net/http グレイスフルなShutdown
  • database/sql キャンセル可能なクエリ
  • no trouble
  • リリース2週間経つが特になし。

リリース後、目立ったトラブルがない点、バージョンアップによるベンチマーク向上をみると、1.8への移行による恩恵は大きいですね。


CAリワード 岡崎

94a4fa5c-239f-11e7-86a0-d77413b72337.JPG

Goのハマりポイントなどを中心とした紹介をしてくれました。
実際にGoを触ると誰もが通る?道だと思う部分や、自分も知らないこともあったため、Go言語の特性について新たな発見がありました。

少しtipsの紹介をしたいと思います。

文字数のカウントを取る

len

RuneCountInString

lenだと3が返りますが、RuneCountInstringを使うと1が返ります。Goのlenは文字数ではなく文字長を返すので、文字数を取得する時はRuneCountInStringを使うという話。

init

これ知らなかったです。initは複数定義が出来るようです。使いどころがまだ分かっていないですが、Goにはこういった特性もあるんですね。

Compare

reflect.DeepEqual

Goではスライス同士の比較に == が使えないので、reflect.DeepEqual を使うという話。他にもGoならではハマりどころやtipsを多数紹介していただきました。


まとめ

CAリワードでは定期的にGo勉強会を開催し、チーム内で技術・ナレッジ共有をおこなっています。また、今回のように他プロダクトの方たちを招き、組織を横断した勉強会なども積極的におこなっています。同じグループ内だからこそ言える、プロダクトにおけるGoの使いどころなど参考になる発表が沢山聞けました。今後も定期的に勉強会の様子をアップしていきますので、よろしくお願いします。

kotaking
kotakingエンジニア