B2B型非同期メッセージングシステムのリアーキテクチャにおけるCloud Spanner活用
Sansan株式会社 / Yusuke Fujiwara
テックリード / フルスタックエンジニア・プロダクトエンジニア / 従業員規模: 1,001〜5,000名 / エンジニア組織: 301名〜500名
| 利用プラン | ツールの利用規模 | ツールの利用開始時期 | 事業形態 |
|---|---|---|---|
エンタープライズ | 11名〜50名 | 2025年5月 | B to B |
| 利用プラン | エンタープライズ |
|---|---|
| ツールの利用規模 | 11名〜50名 |
| ツールの利用開始時期 | 2025年5月 |
| 事業形態 | B to B |
導入の背景・解決したかった問題
導入背景
ツール導入前の課題
元々Sansan Data HubというプロダクトをAzure上に実装しており、システムとしては以下の特性がありました。
- ヘッドレスで多数のメッセージを並列バッチとして処理する必要がある。B2B向けなので、お客様の業務のサイクルに合わせてデータの流入量が変わる。そのため、スケーラビリティとエラスティネスが必要。逆に応答性やスケールの速さは求められない。
- 元々マネージドサービスを全面採用しており、チーム体制としてもインフラメンバーは少ない。
全社的なクラウド基盤の統一を伴うリアーキテクチャを実施するにあたり、以下の要件を満たすデータベースを探していました。
- ACIDトランザクションが直感的に実行できること。移行元はCosmos DBであり、ACIDトランザクションはサポートされていましたが、固有の書き方が必要でした。
- スケールアウト構成が自然ととれること。移行元のCosmos DBおよびAzure SQL Database Elasticpoolではシャーディングを行わずにスケールアウト構成が可能だったので、同様にシャーディングを行わずにスケールアウトできることが理想でした。
- 運用コストが低いこと。一般的にRDBMS系のDBaaSはエンジンのバージョンアップ作業が必要となるので、自動的にアップデートされるSQL Databaseからの移行では運用変更を考慮する必要がありました。
どのような状態を目指していたか
- エンジニアができる限りスケーラビリティの確保の詳細事項に悩まされることないこと
- 単一の分散データベースの採用により、データストアの使い分けによる設計や運用のオーバーヘッドが減らされていること
比較検討したサービス
2024年12月から2025年1月時点にかけて以下を検討しました。
- [AWS] Aurora Serverless DSQL
- [GCP] Alloy DB
- [GCP] Firebase store
- [Azure] SQL Database Hyperscale Elastic pool
選定理由
ACIDトランザクションのサポート、スケールアウト構成、フルマネージドサービスであり運用コストが低いという要件を満たせていたことに加え、
- Spannerは歴史が古く、既にGAから数年経過していたうえ、Googleの他のサービスの基盤となっており、Google Cloudによるコミット度が強かった
- ネイティブAPIとSQLの二重構造になっているため、開発効率よりも実行時に性能を意識した切り替えが可能であった
- Advanced Searchといった機能により、将来的な機能拡張に対して賄える範囲が広い
導入の成果
改善したかった課題はどれくらい解決されたか
- ACIDトランザクションが直感的に実行できること:問題なし
- スケールアウト構成が自然ととれること:問題なし
- 運用コストが低いこと:現状問題なし
どのような成果が得られたか
まだ既存システムの移行が始まったばかりですが、スケーラビリティは問題なく発揮されています。
導入時の苦労・悩み
- 分散データベースであるため、分散データベース固有の技術的な制約がある。なまじSQLが使えるばかりに、RDBMSと同じ感覚で設計しがちであり、性能問題が生じるという問題は表面化した。「SQLが使える分散データベース」であることには留意が必要。
- 単位当たりのコストが高いため、開発環境では最小限のサイズにするなど工夫をした。
- エミュレーターで最新の機能がサポートされないことがあるので注意が必要。
導入に向けた社内への説明
上長・チームへの説明
チームからは以下の懸念が上がりました。
- Spanner自体でSQLが使えるといってもすべてのものが使えるわけではなく学習コストがかかるのではないか
- Spannerの価格は高いので、コストに見合ったスケーラビリティが得られるか
- 分散DBであり、応答速度が重視されるユースケースに不向きであり、システム全体で統一して使うDBとして汎用性が低いのではないか
これらはもっともな懸念でしたが、システムの特性上、水平方向のスケーラビリティが求められる処理が大半であり、応答速度が重視されるケースはほとんどない。そのため、必要に応じて応答速度が重視される場合にのみ別のDBを採用する選択肢を残しつつ、Cloud Spannerを導入することとしました。
活用方法
よく使う機能
- SQLによるCRUD
- リクエストタグ、トランザクションタグ
- 性能がシビアな部分でのネイティブAPIやstale readの使用
- オートスケール
ツールの良い点
- ACIDが使えること、SQLが使えながらもネイティブのAPIも用意されている柔軟性。
- 性能をコントロールするための機能(Stale read等)も、選択肢が適度にある。
- Google Cloudに密に結合されたセキュリティ管理や監視容易性(Query Insightによるクエリプラン、ロック、ホットスポットの調査等)。
- Data Boostにより本番ワークロードと分析ワークロードを分離可能。
ツールの課題点
- SQLが使えるが本質的には分散DBであり、適用個所は選ぶし、分散DB固有の性能特性や内部処理特性の理解は必須。特に純粋な応答性能が求められる部分には向かない。
- テーブルのマイグレーションツールなどのエコシステムがどうしてもそのまま使えない部分があるので、初期導入にはハードルがある。
- エミュレーターが常に最新の機能をサポートするとは限らない。
- 組み込みの統計情報の更新頻度が3日に1回なので注意が必要。
- IAMのroleに癖があり、きめ細かなIAM設定をしたい場合はカスタムロールを作らないと不便(逆に言えばIAMで色々制御したくなるくらいにIAMとシームレスに統合されている)
- SDK 細かい機能はドキュメント化されてない場合もあるので、GitHubでSDKのコードやそのコメントを見ると意外な発見もある。
- Spanner backupを使う場合、バックアップ先もインスタンスを稼働させておく必要があるので課金計算時には注意。
ツールを検討されている方へ
SQLとACIDトランザクションが使える分散DBです。機能的な互換性はありますが、RDBMSではありません。そのことを踏まえて選択するとよい選択肢だと思います。
今後の展望
プロダクトのスケールに伴い、コストの最適化を進めていきます。
Sansan株式会社 / Yusuke Fujiwara
テックリード / フルスタックエンジニア・プロダクトエンジニア / 従業員規模: 1,001〜5,000名 / エンジニア組織: 301名〜500名
よく見られているレビュー
Sansan株式会社 / Yusuke Fujiwara
テックリード / フルスタックエンジニア・プロダクトエンジニア / 従業員規模: 1,001〜5,000名 / エンジニア組織: 301名〜500名


