Slide 1

Slide 1 text

如何に組織にGoを導⼊入するか @y_̲matsuwitter,  Gunosy  Inc. 2015.8

Slide 2

Slide 2 text

2 ©Gunosy  Inc. 本⽇日のアジェンダ n ⾃自⼰己紹介 n 導⼊入: 新技術の導⼊入に失敗した話 n GunosyのGo導⼊入の歴史(2014年年3~∼現在) n Go導⼊入にあたって n 最後に

Slide 3

Slide 3 text

3 ©Gunosy  Inc. ⾃自⼰己紹介 n Gunosy  Inc. – 開発本部執⾏行行役員 n 業務 – 開発全般のマネジメント – Go⾔言語布教係 n 担当(過去) – iOS/Android – Web – Infrastructure(AWSのみ) n 最近の興味 – Microsoft Azure製品郡 松本 勇気 @y_̲matsuwitter

Slide 4

Slide 4 text

4 ©Gunosy  Inc. Dockerエキスパート養成読本 好評発売中

Slide 5

Slide 5 text

5 ©Gunosy  Inc. Gunosyについて n 情報キュレーションサービス – iOS/Androidアプリ – Web n 現在1000万DL突破 n Go⾔言語を1年年半前に導⼊入

Slide 6

Slide 6 text

6 ©Gunosy  Inc. 導⼊入: 新技術導⼊入失敗の話

Slide 7

Slide 7 text

7 ©Gunosy  Inc. Docker導⼊入の話 Chefの代わりとしてのDocker l 1サーバ1コンテナ l Supervisorによる複数プロセスの実⾏行行 DeploymentもDockerで実施 l WebAppをdocker build l 各サーバにfabコマンドにてdocker pull  &  docker run 全てのサーバをDockerでホスティング l Including  Redis,  mongodb …  etc 2014年年4⽉月、Gunosy海外版の開発でDockerを導⼊入

Slide 8

Slide 8 text

8 ©Gunosy  Inc. Docker導⼊入の話② 学習コストの課題 l コンテナという独特な概念念 l docker関連の動作を理理解することのコスト 解決しようとしている課題が不不明瞭だった l ChefやAMIでも⼗十分解決可能 l Dockerらしい解決策は特にとれていない状況で、メンテナンス コストだけは⾼高い状態 結論論として⼤大失敗 ⽬目的が不不明瞭なままでの導⼊入に成功はない

Slide 9

Slide 9 text

9 ©Gunosy  Inc. GunosyのGo導⼊入の歴史(2014年年3~∼現在)

Slide 10

Slide 10 text

10 ©Gunosy  Inc. テレビCMの開始 1 Ruby  on  RailsとSinatraベースのAPI 3 ⼤大幅なUI変更更 2 2014年年3⽉月に控えていた問題 n これまでとは⽐比にならないユーザー獲得の可能性 – サーバ全体の性能を上げる必要 n 配信するデータ量量の⼤大幅増加 – ユーザーが⾒見見れる記事数が数倍以上 n 通知の配信頻度度も増加 n 1台あたり200req/sec – 将来に備え1000req/sec程度度まで性能を上げておきたい n 費⽤用をかけることでスケールする可能性 – ただし、費⽤用分の運⽤用を回すリソースは不不⾜足気味(インフラエンジニア0名) 短期間・少リソースで性能を向上させる必要性 当時の社内サーバでは性能が⼤大きく不不⾜足していた。

Slide 11

Slide 11 text

11 ©Gunosy  Inc. Go導⼊入の決定と理理由 n ⽐比較的安定して多くの リクエストを捌いた n Goroutineとchannelに よる⾮非同期処理理の楽さ n CPUの使い切切りやすさ n ⽐比較的省省メモリ ⾼高パフォーマンス n 依存関係は全てバイナ リに含まれる n クロスコンパイルによ り、⼤大抵のマシン上で 動作する 独⽴立立性の⾼高さ n Einhornなどと組み合わ せ安全な再起動 n GoogleやSoundcloud による運⽤用実績 n Githubでのライブラリ 増加数が急増 =>  利利⽤用 も増えてるといえる 安定運⽤用の実績 少リソースでの性能改善を期待、導⼊入 Nginx-‐‑‒luaやHaskell、node.jsなどと⽐比較しつつ簡易易なロジックを実装・評価

Slide 12

Slide 12 text

12 ©Gunosy  Inc. 初期、どのように導⼊入したか サーバ台数を増やすこと無くユーザー増加に対応 n NginxにてGoとRailsを振り分け – アクセスの多いパスのみGoへ移植 n デプロイはfabricベース – コンパイル済みバイナリを配置 – Einhornを再起動 n プロセスキャッシュ – ⾼高頻度度に必要なデータをプロセス上に配 置、⾼高速に返す 既存のRailsサーバを残しつつの運⽤用へ。 Nginx Rails Golang MySQL Redis ELB

Slide 13

Slide 13 text

13 ©Gunosy  Inc. 社内勉強会の開催 1 開発フローの整備 3 開発ツールの布教 2 社内での利利⽤用を増やすための取り組み n Go標準パッケージについての勉強会 – 毎週持ち回りで発表 – 社外の⽅方も巻き込みつつ13回実施 n go-‐‑‒importsやgo-‐‑‒lintなどの紹介 – 各エディタに必ず保存時実⾏行行 n CircleCIのセットアップ n OpsworksによるGoプロジェクトのテンプレづくり – 現状ではデプロイ含め全てOpsworks管理理へ – デプロイフローの簡素化 現在は殆どの新規システムがGo製になっている チーム開発に向けて様々な施策を実施

Slide 14

Slide 14 text

14 ©Gunosy  Inc. サーバー Gunosyの現在 APIや広告配信、マンガなど多くのシステムでGoが活躍 n guregu/kamiベースのAPI – Contextベースでの実装 – 既存APIへはGoがProxy n React.jsによるフロント – GoはAPIに徹する – デザイナがReact.jsコンポーネント作成 n Opsworksによるスタック⽣生成 – GUIによるサーバ構築 – デプロイを含めた全ての管理理 機能群ごとにサービスを分割するマイクロサービスっぽいもの ReactJS guregu/kami View API

Slide 15

Slide 15 text

15 ©Gunosy  Inc. Go導⼊入にあたって

Slide 16

Slide 16 text

16 ©Gunosy  Inc. なぜそれをGoでやるのか Goが向いている課題・向かない課題が存在している。 向いている課題 向いていない課題 効率率率・デプロイしやすさのフル活⽤用 管理理画⾯面等の領領域は不不向き (できないわけではない) n 軽量量なAPIの構築 – パフォーマンスが最も活かせる – Gunosyもこの⽅方針で利利⽤用 n インフラ系ツールの作成 – どこでも配置・実⾏行行しやすい – Mackerel-‐‑‒agentなどgo製増加 n Scaffoldなどを期待した開発 – 管理理画⾯面など向け – Rails等のFWと⽐比べ柔軟性は低い n ⾼高度度なtemplateの描画 – フルスタックFWの得意な描画は Goでは⾯面倒が多い できないことはないが、向いてない⽤用途で使うのはコストがかかる

Slide 17

Slide 17 text

17 ©Gunosy  Inc. とりあえずGoを導⼊入したいのであれば net/http/httputil l Go標準パッケージにReverseProxyが付属 l 既存APIへのトラフィックをここで中継 l http://golang.org/pkg/net/http/httputil/#ReverseProxy Proxyと組み合わせ、段階的に移⾏行行がおすすめ Nginx. Golang Existing  Apps DB proxy

Slide 18

Slide 18 text

18 ©Gunosy  Inc. 社内のGoエンジニアをふやす コーディング進める上で、だれでもすぐGoへコミットできるように n 各標準パッケージの GoDocとソースコード を読む n Gunosyではa-‐‑‒zまで全 て通して勉強会 n http://golang.org/pk g/ 標準ライブラリを読む n Goの基本の使い⽅方を学 ぶ良良い教材 n 特にchannel周り n https://go-‐‑‒tour-‐‑‒ jp.appspot.com/#1 A  tour  of  Go n Webサーバとかインフ ラ向けのツールなど n テストの仕⽅方含め学ぶ n https://speakerdeck.c om/ymatsuwitter/gof alsetesutofalseji-‐‑‒ben-‐‑‒ tokai-‐‑‒fa-‐‑‒huro 簡単なものを作る Goは標準ライブラリを使うだけでも⼗十分プロダクトを作れる

Slide 19

Slide 19 text

19 ©Gunosy  Inc. コーディング規約をツールでカバー golang/lint l https://github.com/golang/lint l 標準的構⽂文チェックツール go-‐‑‒vet l http://godoc.org/golang.org/x/tools/cmd/vet l ソースコードの中でバグを含みそうなものをチェック goimports l https://godoc.org/golang.org/x/tools/cmd/goimports l パッケージのimport⽂文を⾃自動で追加する その他、oracleなど様々な便便利利ツールがあります。 コーディング進める上で、だれでもGoへコミットできるように環境を作る

Slide 20

Slide 20 text

20 ©Gunosy  Inc. まとめ

Slide 21

Slide 21 text

21 ©Gunosy  Inc. まとめ メリット 導⼊入 社内教育 n 低コストで⾼高パフォー マンス n 独⽴立立性が⾼高く、構築が 容易易 n チーム開発に向けたツ ールが豊富 n APIサーバ向き – 軽量量かつ⾼高負荷な ものが特に。 n 開発環境の統⼀一 – gotoolsを活⽤用 l go-‐‑‒lint l go-‐‑‒vet  …etc n A  tour  of  Goの活⽤用 – Goの⼤大抵のことは 学べる n 社内勉強会 – 標準パッケージを 題材にコードリー ディング ⽬目的に合致する場合Goは⾮非常に良良い⾔言語 Goは導⼊入・学習コストも低く、パフォーマンスを重視するサービスに最適

Slide 22

Slide 22 text

22 ©Gunosy  Inc. GunosyではNo.1を取りに⾏行行きたい エンジニアを募集しています

Slide 23

Slide 23 text

23 ©Gunosy  Inc. ありがとうございました