Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Spanner + Javaで作るモバイルゲームバックエンド
Search
Kanji Hirata
August 10, 2021
Technology
340
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Spanner + Javaで作るモバイルゲームバックエンド
Kanji Hirata
August 10, 2021
Other Decks in Technology
See All in Technology
AIは推し活である。
kurazuuuuuu
1
850
AIによるクリエイティブ生成を行う上での試行錯誤
plaidtech
PRO
0
160
Deployment の 先にある AI Agent 基盤 - kagent vNext、Agent Substrate、Hermes から読み解く Agent Runtime の現在地 / k8s-matsuri-2-ai-agent-platform-amsy810
masayaaoyama
4
670
俺の仕事は AIに奪われないし、たぶんその BIも要らない
hikaruri
0
520
2026-09-18 gotanda.sre Terraformで複数環境作ったり、複数Stateに分割したりそれとTerragrunt / Terraform multi envs and multi states
masasuzu
3
610
絵ではじめるKubernetesセキュリティ
aoi1
4
690
LLMに渡さなかった仕事
nanaism
0
1.1k
目の前の楽しいが人生を変える - コミュニティの螺旋の歩き方と楽しむコツ / change your life
soudai
PRO
5
650
安心して変更できるWebフロントエンドの作り方
pirosikick
5
2.8k
C#コードの結合を可視化する Roslyn解析による設計改善と リファクタリング判断
dora56
0
210
技術的負債から考える、AI時代のエンジニアリング投資 — ビズリーチの技術的負債と向き合った経験から、変更し続けられるソフトウェアを考える/ technical-debt-con2026
visional_engineering_and_design
4
3.3k
30座EKS, 180次升級淬煉的EKS Upgrade Skill 的歷程
eric8230
0
180
Featured
See All Featured
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.2k
The Spectacular Lies of Maps
axbom
PRO
1
1k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
3k
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
430
Navigating Team Friction
lara
192
16k
Marketing to machines
jonoalderson
1
5.8k
Agile that works and the tools we love
rasmusluckow
331
22k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
1
610
Ten Tips & Tricks for a 🌱 transition
stuffmc
1
230
WCS-LA-2024
lcolladotor
0
830
Building Applications with DynamoDB
mza
96
7.2k
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 ライブラリなどの充実したエコシステムを活 用して開発可能