Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Spanner + Javaで作るモバイルゲームバックエンド
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Kanji Hirata
August 10, 2021
Technology
0
310
Spanner + Javaで作るモバイルゲームバックエンド
Kanji Hirata
August 10, 2021
Tweet
Share
Other Decks in Technology
See All in Technology
旅先で iPad + Neovim で iOS 開発・執筆した話
zozotech
PRO
0
100
私たち準委任PdEは2つのプロダクトに挑戦する ~ソフトウェア、開発支援という”二重”のプロダクトエンジニアリングの実践~ / 20260212 Naoki Takahashi
shift_evolve
PRO
2
210
Oracle Base Database Service 技術詳細
oracle4engineer
PRO
15
93k
CDK対応したAWS DevOps Agentを試そう_20260201
masakiokuda
1
420
コスト削減から「セキュリティと利便性」を担うプラットフォームへ
sansantech
PRO
3
1.6k
Exadata Fleet Update
oracle4engineer
PRO
0
1.1k
usermode linux without MMU - fosdem2026 kernel devroom
thehajime
0
240
Codex 5.3 と Opus 4.6 にコーポレートサイトを作らせてみた / Codex 5.3 vs Opus 4.6
ama_ch
0
210
Red Hat OpenStack Services on OpenShift
tamemiya
0
130
AIエージェントに必要なのはデータではなく文脈だった/ai-agent-context-graph-mybest
jonnojun
1
250
フルカイテン株式会社 エンジニア向け採用資料
fullkaiten
0
10k
Cosmos World Foundation Model Platform for Physical AI
takmin
0
970
Featured
See All Featured
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
440
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
130
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
58
50k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
120
Measuring & Analyzing Core Web Vitals
bluesmoon
9
760
Amusing Abliteration
ianozsvald
0
100
Become a Pro
speakerdeck
PRO
31
5.8k
Everyday Curiosity
cassininazir
0
130
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
170
Designing for Performance
lara
610
70k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
110
For a Future-Friendly Web
brad_frost
182
10k
Transcript
Spanner + Javaで作るモバイルゲームバックエンド
発表者について 株式会社ルイーダ 平田 寛二 アプリケーションサーバー開発 / インフラ設計担当
本日お話しすること モバイルゲーム開発での Spanner + Java の使用レポート Spanner + Javaを使ってみて、どのように感じたか 工夫したこと
苦労したこと これまでの状況 新規開発案件にてSpannerを採用 負荷試験まで実施
モバイルゲーム開発にSpannerを使ってみて
モバイルゲーム開発にSpannerを使ってみて モバイルゲーム開発との相性は良い
モバイルゲームの特徴 高いパフォーマンスが求められる ユーザ数が多く、サーバー負荷が高い 様々なデータが、複雑に絡み合う 例: クエストAをクリアすると、アチーブメントBが達成され、アイテムCとキャラD が付与される。キャラDが付与されることで、称号Eが付与される
モバイルゲームとの相性の良さ スケーリング Spanner側で水平スケールするため、シャーディングのロジックを書かなくていい メンテ無しでスケーリング可能 複雑な要件への対応 トランザクションによる整合性の確保が可能 RDBと同様の柔軟なクエリを書くことが出来る
Spanner + Java を使った開発
Spanner + Java を使った開発 エコシステムが充実している
エコシステムの充実 Cloud Trace との連携 ライブラリ側にCloud Traceにデータを送信するコードが書かれている Cloud Traceへの送信設定をするだけで、Cloud Traceを使ったSpannerのトラブルシュ ーティングが可能
例1 → セッションプールが枯渇している
例2 → 同じinsert文を何度も発行しているため、一つのinsert文にまとめるべき
エコシステムの充実 Spring Data Cloud Spanner ライブラリ java-spannerライブラリをラップした各種APIが提供されていて、コード記述量を大幅に 減らすことが出来る ORM 簡単なクエリはORMで発行し、複雑なクエリはベタ書き、といったことが可能
アノテーションによるトランザクション発行 @Transactional をメソッドにつけることでトランザクションを発行出来る トランザクションオブジェクトを引き回す必要が無い
工夫したこと
ORMでのミューテーションAPIの発行をDMLに変更 ミューテーションAPIの特徴 トランザクション中に実行したクエリを、Spannerに逐次発行せず、クライアント側で キャッシュする。コミット時にまとめてクエリを投げる Spannerとの通信回数が減るため、レイテンシ短縮のメリットがある 一方で、Spannerのデータを参照した時に、同一トランザクション内で発行した更新系 クエリの結果が反映されないため、その点に留意する必要あり
ORMでのミューテーションAPIの発行をDMLに変更 DMLの特徴 トランザクション中に実行したクエリは、Spannerと毎回通信して発行される Spannerのデータを参照する時、同一トランザクション内で発行した更新系クエリの結 果が反映される
ORMでのミューテーションAPIの発行をDMLに変更 Spring Data Cloud Spanner が提供しているORMの各種更新形クエリは、ミューテーシ ョンAPIを発行する アプリケーションの複雑度が上がるに従い、データの流れを追いきれなくなる懸念 ライブラリを一部上書きし、全てDMLを発行するよう変更
Abort時のリトライ処理の実装 Spannerでは、トランザクションが競合した際に、片方のトランザクションがAbortされ る仕様がある 現状の Spring Data Cloud Spanner では、Abortされた時のリトライ処理が無い GCP側から、Abortはトランザクションの競合や、他にもSpannerの内部的な理由により
起こることがあるため、リトライは実装するべきとの助言 ライブラリをラップし、デフォルトでリトライするように変更
苦労したこと
苦労したこと - プロジェクト開始時 Spanner全般の仕様の理解 ホットスポット、インターリーブ、トランザクションの排他制御の仕方、etc...
トランザクションの排他制御の仕方 「トランザクションが競合したら片方のトランザクションをAbortさせることで一貫性を 確保する」という仕様に慣れるのに時間がかかった トランザクションの競合が多く発生しうるマルチ関連の状態の管理は、Spannerではな くRedisなど他のDBを採用
苦労したこと - 負荷試験中 カバリングインデックスでないことよるテーブルフルスキャン カバリングインデックスでないとテーブルフルスキャンが発生する。その結果、各リク エストのレイテンシが高くなったり、Abortも頻発する FORCE_INDEX指定により回避(他にも、STORING句を使うなどして回避可能)
苦労したこと - 負荷試験中 トランザクションが複数のスプリットに跨ることによるコミット時間の 増加 一つ一つのクエリの実行には時間がかかっていなくても、最後のコミット処理だけ時間 がかかっていることがあった 複数のスプリットにトランザクションが跨っていることが原因 インターリーブを使用することで、各ユーザのデータを1つのスプリットにまとめるよう にテーブル定義を変更
インデックステーブルのデータも含む(インターリーブが使用可能)
最後に Spanner メンテ無しでの水平スケーリング、複雑な要件に対応可能という点で、モバイルゲームとの 相性は良い Spanner + Java Cloud Trace 連携、Spring
Data Cloud Spanner ライブラリなどの充実したエコシステムを活 用して開発可能