こんにちは、いっちゃんです。10ANTZでは、サクコイのサーバーサイドのソフトウェア開発に携わっています。
本記事では、2025年12月8日に開催された社内勉強会の内容を紹介します。10ANTZでは、業務への直接的な関連性を問わず、エンジニアが幅広いテーマで知見を共有する勉強会を不定期で開催しています。今回は、指定条件のデータをダンプできるツールspanner-dump-whereの業務活用をテーマとした発表が実施されました。以下ではまずサクコイバックエンドで利用しているデータベースSpanner、Spanner周辺ツールの一つであるspanner-dump-whereについて紹介します。そしてその上で、サクコイバックエンドにおいてspanner-dump-whereがどのように活用されているのかについてまとめます。
目次
サクコイにおけるSpannerの利用
10ANTZが運営するスマートフォン向けゲーム「サクコイ」のバックエンドでは、ユーザーデータを格納するデータベースとして Google Cloud Spanner を採用しています。Spannerの導入により、主に以下のメリットを享受しています。
-
負荷分散の自動管理: データのシャーディングや負荷分散をSpanner側で最適化してくれる。
-
容易なスケーリング: Google Cloud コンソールからノード数や処理ユニットを即座に変更できる。
spanner-dump-whereとは
spanner-dump-whereは、既存のツールspanner-dumpをベースに拡張されたコマンドラインツールです。
-
spanner-dump: Spannerから指定したテーブルの全データをINSERT文としてダンプするツールです。ダンプされたデータはそのままSpannerに対して実行することで、元のテーブルのデータを再現することができます。
-
spanner-dump-where: 上記の機能に加え、SQLのWHERE句によるデータ絞り込みが可能です。大量のデータが存在するテーブルでも、必要なレコードだけをピンポイントで取得できます。また、spanner-dumpではINSERT文の順序に外部キー制約が考慮されませんが、こちらでは
-sortオプションを使用することで、外部キー制約に基づいたINSERT文の順序をソートすることも可能となっています。
spanner-dump-whereのインストール方法
以下のコマンドでインストールできます。
|
1 2 |
go install github.com/Jumpaku/spanner-dump-where/cmd/spanner-dump-where@v1.1.0 |
spanner-dump-whereの実行方法
以下のように実行することができます。
|
1 2 3 4 5 6 |
spanner-dump-where -project=${SRC_PROJECT} -instance=${SRC_INSTANCE} -database=${SRC_DATABASE} \ -sort \ -bulk-size=10 \ -from=User -where='Age > 20' \ -from=UserItem -where='UserId = "1"' \ > data.sql |
オプションは以下の通りです。
- -project:ダンプ元のGCPプロジェクトを指定する(必須)。
- -instance:ダンプ元のSpannerインスタンスを指定する(必須)。
- -database:ダンプ元のSpannerデータベースを指定する(必須)。
- -sort:指定テーブル間の外部キー制約に基づく依存関係に応じてダンプされるSQLをソートするかどうかを指定する(指定しない場合ソートされない。)。
- -bulk-size:ダンプされるSQL内の1つのINSERT文同時に挿入するレコードの最大数を指定する。
- -from、-where:-fromでダンプ元のテーブルを指定し、直後の-whereでそのテーブルからデータをダンプする条件をSQLの式で指定する。
結果は標準出力に出力されます。
spanner-dump-whereを活用した不具合調査
サクコイのバックエンド業務においてもspanner-dump-whereを活用しており、特に不具合の再現条件の特定においてとても役立っています。
複雑なユーザーデータに関連する不具合が発生した際、その不具合を再現させるための条件特定が困難な状況があります。ユーザーごとに異なる値を持つ上に、それらの組み合わせが膨大となるため、不具合ユーザーのどのデータが原因となっているのか予想し難くなるためです。
そのような状況への対応には、詳細な調査がしやすい環境で不具合を再現させるため、不具合ユーザーの関連データをまとめてダンプし、開発環境に入れて検証するというアプローチが考えられます。ここでspanner-dump-whereが役に立ちます。
調査に必要なのは不具合ユーザーの関連データだけなので、spanner-dump-whereを使えば、関連テーブルからユーザーIDが一致するデータのみをダンプすることができます。もしspanner-dumpを使用した場合は条件指定ができないため、関連テーブルの全データをダンプすることになってしまいます。これではDBに過大な負荷がかかったり、余計な処理時間がかかったりするおそれがありますが、spanner-dump-whereを使うことでこれらの課題を回避できます。
以下では実際に不具合の調査でspanner-dump-whereが役に立った2つの場面についてより具体的に紹介します。
- 「チュートリアルから進行しない不具合の調査」
- 「所持カードが覚醒できない不具合の調査」
チュートリアルから進行しない不具合の調査
「チュートリアルから先へ進行しない」旨のお問い合わせがあり、手元で試してみましたが再現しませんでした。すぐには再現条件に見当がつかなかったため、spanner-dump-whereを使用してお問い合わせユーザーのチュートリアル関連データを書き出して、開発環境に入れて検証してみました。
そうしたところ、すぐにお問い合わせで言及された現象が再現し、これを起点に調査を進めて根本的な原因を突き止めることができました。
その後影響ユーザーについて確認したところ、再現条件を満たし同不具合が発生する可能性があったのは全ユーザーアカウントの約0.01%だけだったということが分かりました。このように再現条件が満たされることがレアな不具合について原因特定まで漕ぎ着けることができたのは、spanner-dump-whereで特定のユーザーデータをダンプするというアプローチが功を奏したものと考えています。
所持カードが覚醒できない不具合の調査
「所持しているカードが覚醒できない」旨のお問い合わせがありました。しかし、お問い合わせユーザーより共有いただいたスクリーンショットには、お問い合わせで言及されていたメンバーとは別のメンバーのカードが表示されており、ユーザーの勘違いである可能性がありました。
これが勘違いであるかどうかを確かめるために、spanner-dump-whereでお問い合わせユーザーのカードデータをダンプして開発環境に入れました。スクリーンショットと同じ画面を表示させるための手順をUnityで検証した結果、ユーザーがカードを勘違いしていることを突き止めました。
表示関連の挙動はログやデータベースで確認することができないため、ユーザーによる勘違いなのか、再現条件不明の不具合なのかを区別することが困難な場合があります。上記のお問い合わせでこれを区別できたのは、表示の元となる特定のデータをダンプしてユーザーと同じ状況を手元で容易に作ることができたためで、この調査でもspanner-dump-whereが役に立ちました。
まとめ
本記事では、弊社のサクコイにおけるspanner-dump-whereの業務活用について紹介しました。
spanner-dump-whereは、Spannerから指定条件で絞り込んだデータをINSERT文としてダンプするツールです。ダンプしたデータを開発環境に入れるというアプローチは、特定ユーザーの状況を手元で再現し詳細に調査をしたい場面で有効だと思いました。
ただし、コマンドラインで直接使用する際には誤操作のリスクもあるため、今後は内部でspanner-dump-whereを実行するような形でツール化できないか検討しようと思います。