Mercari Engineering Blog

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

SchemaSpy を使って自動で ER 図生成してみた

メルペイのソフトウェアエンジニアの @syu_cream です。最近はもっぱらメルペイにて決済の仕組みを担うマイクロサービスの開発やログ収集を行うための基盤作りをして過ごしております。

本記事では、メルペイのログ収集基盤を構築するにあたって取り組んだ、 ER 図自動生成の話を書きます。

背景

メルペイのプロダクト開発

何度か発信させていただいている通り、メルペイが提供するさまざまなサービスの機能はマイクロサービスアーキテクチャに基づいて開発されています。 マイクロサービスとして機能を開発していく細かな経緯や思想などは、以下の記事を読んでいただけるとより深く知っていただけると思います。

mercan.mercari.com

メルペイの各マイクロサービス開発は、各開発チームがオーナーシップを持って、非常に早いスピードで進めています。 下図はあくまでイメージですが、現在メルペイではこのように各マイクロサービスが連携していくような構成になっています。 本記事執筆時でも 10 以上のマイクロサービスの開発が同時進行しており、筆者としてもかつてない変化の渦中にいると感じています。

f:id:syu_cream:20180524174134p:plain

ログ収集における課題

さてこのマイクロサービスアーキテクチャに基づいた素早く自律的な開発スタイル、ログ収集という点ではいくつか課題を感じます。 その中の一つに「どのマイクロサービスがどんなデータを保持するか把握できない」が挙げられます。 更に開発中のマイクロサービスは保持することが想定されるデータが頻繁に変更されることが想定されます。 メルペイも規模としてはメルカリにはまだ及びませんが、それでも 10 を超えるマイクロサービスの個々のデータ保持状況をトラッキングしていくのは非常にコストがかかります。

これはメルペイに限らずメルカリでも言えることですが、例えば BI チームなど、直接プロダクトの開発を行うソフトウェアエンジニア以外にデータを参照して活かすメンバーが存在します。 (メルカリの例になってしまいますが、以下の記事を読んでいただければイメージが掴めると思います)

tech.mercari.com

メルペイのプロダクト開発のスピードに追従しつつも、追従するためのコストを低減して個々のメンバーが本来やりたいことに専念できるようにしたい。 そう思い、本記事で記述する ER 図自動生成にいきつきました。

提案: 定期的な ER 図自動生成

SchemaSpy による ER 図自動生成

メルペイの各マイクロサービスが保持するデータに関する情報について、解決方法はいろいろ考えられると思われます。 例えば開発を担当するエンジニアが頑張ってドキュメントを書く、開発に直接関わらないメンバーが各マイクロサービスのソースコードを頑張って読む(!?)など。 しかしここではまず低コストで継続可能な、かつ各マイクロサービス担当者でも読解可能な情報共有・更新方法を取ることを優先しました。 そこで考えたのが、 SchemaSpy というツールを用いた ER 図自動生成です。 このツールを用いた ER 図自動生成は下図のようなイメージで実施しています。

f:id:syu_cream:20180524174424p:plain

SchemaSpy は Java で実装された、 ER 図や関連するテーブル・カラムなどの情報をまとめたドキュメントを HTML の形で出力してくれるツールです。 出力結果のイメージは、公式の Sample Output を見ていただけると把握しやすいかと思われます。 簡単に解説しますと、この出力結果では以下のようなことが実現できます。

  • テーブルやカラムの定義の閲覧
  • テーブルやカラム名による検索
  • テーブルやカラム名のコメントの確認
  • ER 図の閲覧

github.com

基本的な使い方としては、稼働するデータベースサーバに接続して指定のデータベースに関するドキュメントを生成する形になります。 メルペイでは現在は、各マイクロサービスの GitHub リポジトリの master ブランチを取得してデータベースの定義が記述された sql ファイルを元にデータベースを構築し、 SchemaSpy を用いて最新のドキュメントを生成するようにしています。 また定期的に更新するため、現状ではこの更新処理を CircleCI を用いて毎日深夜に実行するようにしています。

リレーションの補完

この ER 図生成ですが、残念ながら外部キー制約を張っていない場合リレーションの補足がしにくくなります。 SchemaSpy はカラム名などの情報からある程度のリレーションの自動補完を行ってくれるのですが、この挙動もカバーする範囲が非常に狭くなります。

そこで別途柔軟にリレーションを推測するために、MySQL のテーブル定義からさまざまなルールを用いて外部キー制約を推測する hakagi というツールを作り、 SchemaSpy によるドキュメント生成を行う前にこのツールを実行するようにしてみました。 この施策は実施したばかりでうまくワークするかは不明ですが、徐々に精度を高めていき、最終的に ER 図を閲覧する人の負荷を下げるのに貢献したく考えています。

syucream.hatenablog.jp

おわりに

メルペイにおける、 ER 図自動生成によるデータに関するドキュメント共有の仕組み、いかがでしたでしょうか。 この施策もまだ走り出したばかりでうまく回るかは不明な点が多々ありますが、少ないコストで使いやすいドキュメントが手に入るようになったのではないかと考えています。

メルペイではデータに関する課題を解決しながらより良いプロダクトを、あんしん・あんぜんに提供していきます。 そのために本記事のような小粒な補助ツールや、更に規模の大きいログ収集基盤などの構想を練っていきたいと考えています。

CM コーナー!

本記事ではメルペイにおけるログ収集基盤の、そのまた細部の話を記述してしまいましたが、もちろん他にも課題は多々あります。 メルペイでは自身のアイデアを形にしていき、一緒にプロダクトをより良くしていくための仲間を絶賛募集中です! ログ関連でなく、決済の仕組みを開発してみたい方、収集したデータで分析を行いたい方もぜひ! もしご興味を持っていただけましたら、以下のページを閲覧してみていただけると幸いです :)

www.merpay.com