こんにちは、バックエンドエンジニアの夏(なつ)です。今回は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上に取得する際に利用しています。
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準拠の認可フレームワークとして利用
ライブゲームのプラットフォームとしてどういう開発をしてきたかについては、また別途ブログで紹介できればと思います
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!
ミラティブでは より高速で安定的に開発できるよう開発体験を一緒に向上していけるエンジニアを募集中です!
https://speakerdeck.com/hr_team/mirrativ-letter-from-ctospeakerdeck.com