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

Golang Use Case in MONSTER STRIKE

Golang Use Case in MONSTER STRIKE

4月22日(金) に開催した『ミクシィにおける Go 活用事例 〜 #gocon 2022 Spring 前夜祭(非公式)〜』における「モンストとGoとBazelと(松原 信忠 / モンスト事業本部)」で使用した資料です。
https://mixi.connpass.com/event/245232/

MIXI ENGINEERS

April 25, 2022
Tweet

More Decks by MIXI ENGINEERS

Other Decks in Technology

Transcript

  1. モンストのざっくり構成図 App や Batch サーバーで Ruby を使っています Ruby Logo by

    Yukihiro Matsumoto is licensed under the Creative Commons Attribution-ShareAlike 2.5 License 4
  2. モンストとGo 主に各サーバーを操作する Deploy サーバーで使う自作 CLI ツールに Go を使ってます Ruby Logo

    by Yukihiro Matsumoto is licensed under the Creative Commons Attribution-ShareAlike 2.5 License 5
  3. BazelとGo Go は Bazel との相性が良い(個人の感想) Go はシングルバイナリを作る際に C などの依存がほとんどない 通信・暗号系のライブラリが

    Go で書かれている(公式パッケージ) Bazel は依存関係を明示する必要があるため他言語との依存は扱いにくい Go はクロスコンパイルが簡単にできる Bazel にはクロスコンパイルのためのインターフェースがある Mac から Linux のバイナリを作ってそのまま Docker イメージにできる Bazel でのイメージ作成は基本的に Docker の外で行われるため、クロスコンパイルできた方がいい 11
  4. BazelとGo Bazel では依存関係を全て列挙しなければいけない しかし、依存関係を全て Bazel の設定ファイルに手書きするのは大変です Gazelle : Goコードから自動で Bazel

    の設定ファイルを生成してくれる load("@bazel_gazelle//:def.bzl", "gazelle") # gazelle:prefix github.com/example/project gazelle(name = "gazelle") bazel run //path/to/project:gazelle とするだけ 12
  5. BazelとGo Go プロジェクトの依存パッケージは vendoring しています Go プロジェクト間で依存パッケージが完全に独立できる Gazelle を利用することで vendoring

    先にも Bazel の設定ファイルを配置可能 注意:元から Bazel の設定ファイルがあるとうまく動作しない go mode vendor + 元からある Bazel の設定ファイルの削除 + Gazelle をコマンド化 load("//build/rules/go:def.bzl", "go_project") go_project() # gazelle をラップしている bazel run //path/to/project:vendoring とするだけ 13
  6. BazelとGo 欠点:Go プロジェクト毎に Go のバージョンを別にはできない 解決方法:ツールチェインを別名で設定 load("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_dependencies", "go_download_sdk")

    go_rules_dependencies() go_register_toolchains(version = "1.18") go_download_sdk(name = "go_sdk_old", version = "1.17.6") オプション --extra_toolchains=@go_sdk_old//:go_linux_amd64 で切り変える 14
  7. おまけ:BazelのGo以外の用途 コンテナの作成(rules_docker) Helm による GKE へのデプロイ(自作ルール) 設定ファイルの自作テストスイートのビルドと実行 配布されているソフトウェアのパッケージ化 サーバー構成図(diagrams)の生成(rules_docker) Elm

    プロジェクトのビルドとテスト(自作ルール) OpenAPI のビルド(自作ルール) Ruby プロジェクトのテストと静的型検査(rules_ruby) Rust 製 OSS のインストール(rules_rust) 15
  8. まとめ モンストのサーバーサイドの本体は Ruby です 開発を支援する自作ツールで Go が使われています サーバーに配布したい自作 CLI ツール

    GKE上で動かしてる自作アプリケーション モンスト本体の一部機能でも Go が使われています WebSockets サーバー レコメンドサーバー これらはモノレポ + Bazel で効率よく管理されています おまけ:他にもさまざまな用途で Bazel が使われています 17