Upgrade to Pro — share decks privately, control downloads, hide ads and more …

HowToIntroduceGo

 HowToIntroduceGo

dots.主催Go言語勉強会にて「如何に組織にGoを導入するか」

y_matsuwitter

August 18, 2015
Tweet

More Decks by y_matsuwitter

Other Decks in Programming

Transcript

  1. 2 ©Gunosy  Inc. 本⽇日のアジェンダ n ⾃自⼰己紹介 n 導⼊入: 新技術の導⼊入に失敗した話 n

    GunosyのGo導⼊入の歴史(2014年年3~∼現在) n Go導⼊入にあたって n 最後に
  2. 3 ©Gunosy  Inc. ⾃自⼰己紹介 n Gunosy  Inc. – 開発本部執⾏行行役員 n

    業務 – 開発全般のマネジメント – Go⾔言語布教係 n 担当(過去) – iOS/Android – Web – Infrastructure(AWSのみ) n 最近の興味 – Microsoft Azure製品郡 松本 勇気 @y_̲matsuwitter
  3. 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を導⼊入
  4. 8 ©Gunosy  Inc. Docker導⼊入の話② 学習コストの課題 l コンテナという独特な概念念 l docker関連の動作を理理解することのコスト 解決しようとしている課題が不不明瞭だった

    l ChefやAMIでも⼗十分解決可能 l Dockerらしい解決策は特にとれていない状況で、メンテナンス コストだけは⾼高い状態 結論論として⼤大失敗 ⽬目的が不不明瞭なままでの導⼊入に成功はない
  5. 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名) 短期間・少リソースで性能を向上させる必要性 当時の社内サーバでは性能が⼤大きく不不⾜足していた。
  6. 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などと⽐比較しつつ簡易易なロジックを実装・評価
  7. 12 ©Gunosy  Inc. 初期、どのように導⼊入したか サーバ台数を増やすこと無くユーザー増加に対応 n NginxにてGoとRailsを振り分け – アクセスの多いパスのみGoへ移植 n

    デプロイはfabricベース – コンパイル済みバイナリを配置 – Einhornを再起動 n プロセスキャッシュ – ⾼高頻度度に必要なデータをプロセス上に配 置、⾼高速に返す 既存のRailsサーバを残しつつの運⽤用へ。 Nginx Rails Golang MySQL Redis ELB
  8. 13 ©Gunosy  Inc. 社内勉強会の開催 1 開発フローの整備 3 開発ツールの布教 2 社内での利利⽤用を増やすための取り組み

    n Go標準パッケージについての勉強会 – 毎週持ち回りで発表 – 社外の⽅方も巻き込みつつ13回実施 n go-‐‑‒importsやgo-‐‑‒lintなどの紹介 – 各エディタに必ず保存時実⾏行行 n CircleCIのセットアップ n OpsworksによるGoプロジェクトのテンプレづくり – 現状ではデプロイ含め全てOpsworks管理理へ – デプロイフローの簡素化 現在は殆どの新規システムがGo製になっている チーム開発に向けて様々な施策を実施
  9. 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
  10. 16 ©Gunosy  Inc. なぜそれをGoでやるのか Goが向いている課題・向かない課題が存在している。 向いている課題 向いていない課題 効率率率・デプロイしやすさのフル活⽤用 管理理画⾯面等の領領域は不不向き (できないわけではない)

    n 軽量量なAPIの構築 – パフォーマンスが最も活かせる – Gunosyもこの⽅方針で利利⽤用 n インフラ系ツールの作成 – どこでも配置・実⾏行行しやすい – Mackerel-‐‑‒agentなどgo製増加 n Scaffoldなどを期待した開発 – 管理理画⾯面など向け – Rails等のFWと⽐比べ柔軟性は低い n ⾼高度度なtemplateの描画 – フルスタックFWの得意な描画は Goでは⾯面倒が多い できないことはないが、向いてない⽤用途で使うのはコストがかかる
  11. 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
  12. 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は標準ライブラリを使うだけでも⼗十分プロダクトを作れる
  13. 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へコミットできるように環境を作る
  14. 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は導⼊入・学習コストも低く、パフォーマンスを重視するサービスに最適