Mirrativ Tech Blog

株式会社ミラティブの開発者(バックエンド,iOS,Android,Unity,機械学習,インフラ, etc.)によるブログです

Mirrativ のバックエンドで使っているGoライブラリを紹介する!

こんにちは、バックエンドエンジニアの夏(なつ)です。今回はMirrativのバックエンドで使っているライブラリをご紹介します。

これらの記事のバックエンド版になります!(2年越し) tech.mirrativ.stream tech.mirrativ.stream

ライブラリ一覧

https://pkg.go.dev/ オリジナルの The Go gopher(Gopherくん)Renée French によるデザイン

cloud.google.com/go/bigquery

分析チームが生成したユーザの特徴量などがBigQuery上に存在しているため、それらをバッチ処理でMySQL上に取得する際に利用しています。

tech.mirrativ.stream

cloud.google.com/go/compute/metadata

開発環境などでしか動いてほしくない処理が本番環境上で動かないようにGCPのProject IDをmetadata経由で取得してガードしています

if os.Getenv("FOO_ENV") == "development" {
    if projectID, _ := metadata.NewClient(&http.Client{Timeout: time.Second}).ProjectID(); projectID == "foo-production" {
        panic("only production env is supported on foo-production")
    }
}

cloud.google.com/go/profiler

Google Cloud Profilerで継続的プロファイリングを行うため、webサーバや非同期処理用のdaemonサーバで利用

cloud.google.com/go/pubsub

Google Play Billing Library v3対応時にコンビニでのお支払いに対応するため、Google CloudのPub/Subを使って、Google Play Developer APIのリアルタイムデベロッパー通知(RTDN)を受信する際に利用

cloud.google.com/go/storage

一部の画像ファイルなどをGoogle Cloud Storageに保存しているために利用

github.com/Songmu/prompter

インタラクティブコマンドでユーザの入力(Yes/Noなど)を受け取るために利用

github.com/aws/aws-sdk-go

一部の画像ファイルなどをAmazon S3に保存しているために利用

github.com/bradfitz/gomemcache

一部のキャッシュデータをmemcachedに保存するために利用

github.com/bradleyfalzon/ghinstallation

github.com/google/go-github

github.com/gocarina/gocsv

ミラティブではマスターデータをcsvとしてgitで管理しており、その変更をGitHub API経由でcommitする際に利用

github.com/getkin/kin-openapi

ミラティブではAPIはOpenAPIで記述されており、開発環境でパラメータやレスポンスを実行時に検証するために利用

github.com/getsentry/sentry-go

本番環境でエラーを収集するために利用

github.com/git-chglog/git-chglog

github.com/tcnksm/ghr

リリース時にGitHub Releaseへビルド成果物を配布する際に利用

また、その際にCHANGELOGも自動で生成

github.com/go-sql-driver/mysql

主たる永続化先としてMySQLに保存するために利用

github.com/golang/mock

ユニットテスト時のモックに利用

github.com/golangci/golangci-lint

コードの静的解析ツールとして利用

github.com/gomodule/redigo

一部のデータをRedis互換の内製ミドルウェアに保存するために利用 tech.mirrativ.stream

github.com/google/go-cmp

テストなどで複雑な構造体の比較を柔軟に行いたい場合に利用

github.com/google/uuid

UUID生成に利用

github.com/google/wire

依存性の注入(Dependency Injection)に利用

github.com/gorilla/mux

HTTPリクエストとcontroller関数を紐付けるルーティングに利用

github.com/hashicorp/consul/api

バックエンドからは名前解決としてconsulを利用しており、その接続のために利用

github.com/hashicorp/go-multierror

複数のエラーをまとめて返す際に利用

github.com/k0kubun/sqldef

DBのスキーマ管理に利用

github.com/miiton/kanaconv

Elasticsearchへのデータ挿入時の正規化(ひらがなカタカナ・全角半角など)に利用

github.com/olivere/elastic/v7

全文検索用にElastisearchへの接続時に利用

github.com/ory/fosite

ライブゲームのプラットフォームとして、ゲーム開発会社に提供する各種APIのためのOAuth 2.0 / OpenID Connect準拠の認可フレームワークとして利用

prtimes.jp

ライブゲームのプラットフォームとしてどういう開発をしてきたかについては、また別途ブログで紹介できればと思います

github.com/patrickmn/go-cache

プロセス内のインメモリでキャッシュデータを扱いたい時に利用

github.com/pkg/errors

エラーにスタックトレースを付与するために利用

github.com/rivo/uniseg

絵文字を含む文字列のカウントに利用

github.com/samber/lo

lodashライクなgenerics関連の便利な関数用

github.com/stretchr/testify

テスト時のassertion用

github.com/tidwall/gjson

json内の一部データを手軽に取り出す際に利用

E2EのテストでAPIレスポンスのJSONのうち、一部のデータだけを検証したい時に便利

github.com/urfave/cli/v2

各種コマンド実装に利用

github.com/valyala/quicktemplate

テンプレートエンジン

事前にGoコードに変換するため標準のtemplateよりもパフォーマンスが優れている上、実行時エラーも分かりやすい

ただし、標準のtemplateではないので、エディターでのsyntax highlightが効きづらい

golang.org/x/exp

golang.org/x/exp/slicesやgolang.org/x/exp/mapsなどgenerics関連の便利な関数用

基本的にはこちらを優先し、それ以外の便利関数は github.com/samber/lo を利用

golang.org/x/image

webpを扱う際に利用

golang.org/x/tools

内製のlinterやgeneratorなどでASTを扱う際に利用

gopkg.in/yaml.v3

一部設定ファイルがyamlで定義されており、それらの読み書きに利用

vitess.io/vitess

vitess自体を利用しているのではなく、SQLのパーサーとして利用

おわりに

ミラティブのバックエンドはもともとPerlで実装され、それをGo移植したこともあり、細かい既存要件を満たすために、外部のWebフレームワークなどは使わず、必要に応じて内製したり、個別のライブラリを組み合わせて実現しています。

また、Go 1.18でgenericsが導入されたので、喜び勇んで導入してみましたが、Go言語は他のモダンな言語に存在するような便利なラムダ式がまだなく、ちょっとしたmap/filterを書くにも型を明示的に書く必要があるため、アプリケーションロジックを書く場合はfor文の方が今のところ分かりやすいかもなっていう箇所が多々あります。 とはいえ、genericsはGoに導入されたばかりなので今後の改善やコミュニティの反応を見つつ、ミラティブのバックエンドとしてどこまでgenericsを活用していくか探っていきたいと思っています。

We are hiring!

ミラティブでは より高速で安定的に開発できるよう開発体験を一緒に向上していけるエンジニアを募集中です!

www.mirrativ.co.jp

https://speakerdeck.com/hr_team/mirrativ-letter-from-ctospeakerdeck.com