Mercari Engineering Blog

We're the software engineers behind Mercari. Check out our blog to see the tech that powers our marketplace.

メルペイにおけるGoogle Cloud Spannerの取り組み

この記事は MERPAY TECH OPENNESS MONTH の 2日目の記事です。

こんにちは、メルペイのバックエンドエンジニアの @sinmetal です。

メルペイではメインのデータベースとして、 Google Cloud Spanner を利用しています。 SpannerはGoogleが独自開発した強力なデータベースですが、Google Cloud Spannerがサービスとして公開されてからまだ2年ほどしか経過していません。 そのため、まだ世界に公開されているノウハウが乏しく、メルペイの中でも実際開発していく中で、設計上の苦悩や、運用時の問題にぶつかることがありました。

調査したこと、解決したことなどは記事として公開しているので、Spannerに興味がある方は読んでみてください。

Spanner Library, Toolの公開

Spannerはノウハウも少ないですが、周辺ツールやライブラリも乏しいです。 メルペイでは Go を利用して開発を行っていますが、開発や運用で困ったことがあるとLibraryやToolを開発しています。 その中の一部は GCPUG Organization, Mercari Organization で公開しており、だれでも利用、コントリビュートができます。 現在、公開しているのは以下の4つです。

hake

https://github.com/gcpug/hake

Goから任意のQueryを実行した時に返ってくる GenericColumnValue をJSONやCSVに変換するLibraryです。 GenericColumnValueを解釈して、処理するのが結構大変なので、作成されました。

名付け親はメルペイ エキスパートチームの @mhidaka さんです。

spshovel

https://github.com/gcpug/spshovel

任意のQueryの結果をCSVとして出力するToolです。 gcloud spanner databases execute-sql はResponseが10MBまでしか扱えないため、Responseサイズが大きくなる任意のQueryを実行するために生まれました。 任意のQueryを実行できるToolとしては bolt もあるのですが、結果をCSVで出力したかったので、作ってみました。

名付け親は僕です。

zagane

https://github.com/gcpug/zagane

Cloud Client Library for Go を利用している時に起こりがちなコードのミスを静的解析で発見するToolです。

以下の3つのミスをあぶり出します。

  • unstopiter: it finds iterators which did not stop.
  • unclosetx: it finds transactions which does not close
  • wraperr: it finds (*spanner.Client).ReadWriteTransaction calls which returns wrapped errors

Iteratorやtransactionの閉じ忘れはUnitTestで確認するのが難しく、実際のSpannerで動作させた場合も、ある程度リクエストが来た時にSession数をモニタリングしていて気付くといった感じで、発見が難しいです。 弊社でも負荷試験の時に初めて気付くということが何度かありました。(実際に開発中にどのようなことが起こったのかは Spannerでの開発中に起こったミス にまとめています)

そのため、なるべく早い段階でミスを発見するために、zaganeが誕生しました。

名付け親はメルペイ エキスパートチームの @tenntenn さんです。

yo

https://github.com/mercari/yo

スキーマからSpannerにアクセスする基本的なロジックを生成するツールです。 xo から派生しているので、xo likeなツールになっています。

元々、MySQLを利用するように作成されていたアプリケーションをSpannerに置き換える時に誕生しました。 スキーマを見ながらGoのstructや基本的なSELECTロジックなどを自分で書くのが大変みたいな時に力を発揮します。

名付け親はメルペイ アーキテクトチームの @kazegusuri さんです。

GCPUG Shared Spanner

Spannerに興味があるが試す環境がないという方のために、 GCPUG Shared Spanner へスポンサーとしてSpannerを提供しています。 Spannerは大規模なサービスにはよいのですが、起動したままにした場合、月額最低料金が数万円かかるので、個人で試すには勇気が必要です。 今回紹介したLibraryやToolにPRを送るにもテストするための環境が必要になるので、そのような用途でも公開されているSpannerが存在することは価値があることだと考えています。 そのため、コミュニティで共有するSpannerを作成し、個人でも気楽にSpannerが試せる環境を作ることで、SpannerのノウハウやSpannerを利用したことがあるエンジニアが増えていくことを期待しています。

さいごに

GCPUG Shared Spanner を作成するにあたり、予算が欲しいです!と言ったら、笑顔でいいよ!と即答してくれた メルペイCTOの曾川さんに感謝を!

MERPAY TECH OPENNESS MONTH の 3日目の記事はメルペイソリューションチームの2人目 @vvakame による「AppEngineの旧Log APIを脱却したい話」です! メルペイでは主にGKEを利用していますが、メルカリグループ全体を見るとApp Engineも利用しています。 App Engineは世代交代を始めているので、今までApp Engine Standardを利用していた人, そしてこれからApp Engineを使おうとしている人はログについてのマニアックな話になるので、面白いと思います!