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
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
「違う現場で格闘する二人」——社内コミュニティがつないだトヨタ流アジャイルの実践とその先
shinichitakeuchi
0
280
Cloud WAN MCP Serverから考える新しいネットワーク運用 / 20251228 Masaki Okuda
shift_evolve
PRO
0
140
Claude Codeを使った情報整理術
knishioka
20
12k
旬のブリと旬の技術で楽しむ AI エージェント設計開発レシピ
chack411
1
220
ECS_EKS以外の選択肢_ROSA入門_.pdf
masakiokuda
1
130
kintone開発のプラットフォームエンジニアの紹介
cybozuinsideout
PRO
0
500
AWS re:Inventre:cap ~AmazonNova 2 Omniのワークショップを体験してきた~
nrinetcom
PRO
0
140
たかがボタン、されどボタン ~button要素から深ぼるボタンUIの定義について~ / BuriKaigi 2026
yamanoku
1
230
First-Principles-of-Scrum
hiranabe
4
1.8k
#22 CA × atmaCup 3rd 1st Place Solution
yumizu
1
140
I tried making a solo advent calendar!
zzzzico
0
150
Keynoteから見るAWSの頭の中
nrinetcom
PRO
1
170
Featured
See All Featured
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
49
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
690
Git: the NoSQL Database
bkeepers
PRO
432
66k
How STYLIGHT went responsive
nonsquared
100
6k
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
210
Code Reviewing Like a Champion
maltzj
527
40k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
38
The Invisible Side of Design
smashingmag
302
51k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
0
89
It's Worth the Effort
3n
188
29k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
110
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
1
1.4k
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 ライブラリなどの充実したエコシステムを活 用して開発可能