GREE Tech Conference 2021 で発表された資料です。 https://techcon.gree.jp/2021/session/Session-8
SINoALICE -シノアリス-Google Cloud Firestoreを用いた観戦機能の実現について株式会社ポケラボ サーバーエンジニア山口 拓郎
View Slide
• 本公演のターゲット• Google Cloud Firestoreに興味がある方• シノアリスのリアルタイムバトルのシステムに興味がある方はじめに2
• 山口 拓郎(Takuro Yamaguchi)• 2016年新卒エンジニアとしてポケラボに入社• AKB48ステージファイター2 バトルフェスティバル• SINoALICE -シノアリス-• 新卒から現在に至るまでサーバーサイドエンジニアとして従事自己紹介3
本日の流れ41.シノアリスとは2.観戦機能とは3.コロシアムのシステム紹介4.発生した課題と解決方法について
1.シノアリスとは5
シノアリスとは6
シノアリスとは7• リアルタイム通信対戦『コロシアム』について• シノアリスのメインコンテンツである、ギルド対抗バトル• 最大15人のギルドメンバーと協力し、対戦ギルドの”イノチ”を奪い合う• 1回20分間の対戦で、より多くの”イノチ”を獲得した方の勝利
2. 観戦機能とは8
観戦機能について(始まり)9• コロシアムで世界1位のギルドを決める「WORLD GRAN COLOSSEUM」を開催
観戦機能について(始まり)10• コロシアムで世界1位のギルドを決める「WORLD GRAN COLOSSEUM」を開催• 実際に出場するお客様だけでなく• 出場されないお客様にも一緒になって楽しんでもらえるよう様々な検討を重ねた結果• 世界一を決める激戦をみんなで観戦・応援できる仕組みを導入することとなりました
観戦機能について(始まり)11• コロシアムで世界1位のギルドを決める「WORLD GRAN COLOSSEUM」を開催• 実際に出場するお客様だけでなく• 出場されないお客様にも一緒になって楽しんでもらえるよう様々な検討を重ねた結果• 世界一を決める激戦をみんなで観戦・応援できる仕組みを導入することとなりました※開発画面
観戦機能について(始まり)12• コロシアムで世界1位のギルドを決める「WORLD GRAN COLOSSEUM」を開催• 実際に出場するお客様だけでなく• 出場されないお客様にも一緒になって楽しんでもらえるよう様々な検討を重ねた結果• 世界一を決める激戦をみんなで観戦・応援できる仕組みを導入することとなりました
観戦機能について(技術方針)13
観戦機能について(技術方針)14
観戦機能について(技術方針)15
Cloud Firestore観戦機能について(技術方針)16• 柔軟な階層型データ構造に対応• リアルタイムアップデート• Firebase Unity SDK から扱える• シノアリスのアプリには既に導入済みだった
3. コロシアムのシステム紹介17
コロシアムのシステム紹介(構成)18
コロシアムのシステム紹介(構成)19● Unity 2018.4.2f1● Apache / PHP(7.0)● Amazon AuroraMySQL● Memcached● CDN(Akamai)
コロシアムのシステム紹介(構成)20● ポケラボ謹製リアルタイム通信サーバ(通称「Reflector」)○ Java○ クライアントと常時接続○ Appサーバが提供するHTTPサービスを定期的に実行○ データストアとしてHazelcastを利用
コロシアムのシステム紹介(状態同期)2111. App サーバへ現在の状態を取得する HTTP サービスを実行
コロシアムのシステム紹介(状態同期)2211. App サーバへ現在の状態を取得する HTTP サービスを実行2. 現在の状態を Reflector に返却2
コロシアムのシステム紹介(状態同期)2311. App サーバへ現在の状態を取得する HTTP サービスを実行2. 現在の状態を Reflector に返却3. App サーバから返却された状態をClient に転送23
コロシアムのシステム紹介(状態同期)2411. App サーバへ現在の状態を取得する HTTP サービスを実行2. 現在の状態を Reflector に返却3. App サーバから返却された状態をClient に転送4. 転送された状態を元に画面同期234
コロシアムのシステム紹介(ユーザー行動)251. 武器使用などのユーザーの行動メッセージを送信1
コロシアムのシステム紹介(ユーザー行動)2621. 武器使用などのユーザーの行動メッセージを送信2. App サーバへユーザーの行動を登録する HTTP サービスを実行1
コロシアムのシステム紹介(ユーザー行動)2721. 武器使用などのユーザーの行動メッセージを送信2. App サーバへユーザーの行動を登録する HTTP サービスを実行3. 行動に基づいた処理を実行、結果を Reflector に返却31
コロシアムのシステム紹介(ユーザー行動)2821. 武器使用などのユーザーの行動メッセージを送信2. App サーバへユーザーの行動を登録する HTTP サービスを実行3. 行動に基づいた処理を実行、結果を Reflector に返却4. 返却された結果を Client に転送341
コロシアムのシステム紹介(Firestore導入:戦況)29
コロシアムのシステム紹介(Firestore導入:戦況)301. Reflector から App サーバへHTTP サービスを実行1
コロシアムのシステム紹介(Firestore導入:戦況)311. Reflector から App サーバへHTTP サービスを実行2. 結果を Reflector に返却すると共に Firestore へ書き込み 12
コロシアムのシステム紹介(Firestore導入:戦況)321. Reflector から App サーバへHTTP サービスを実行2. 結果を Reflector に返却すると共に Firestore へ書き込み3. Firestore 上のデータ読み取り123
コロシアムのシステム紹介(Firestore導入:チャット)33
コロシアムのシステム紹介(Firestore導入:チャット)341. Client から App サーバへメッセージ送信1
コロシアムのシステム紹介(Firestore導入:チャット)351. Client から App サーバへメッセージ送信2. 結果を Firestore へ書き込み21
コロシアムのシステム紹介(Firestore導入:チャット)361. Client から App サーバへメッセージ送信2. 結果を Firestore へ書き込み3. Firestore 上のデータ読み取り231
Firesto 上のデータ構造(仕様)37• Cloud Firestore はNoSQL ドキュメント指向データベース• データは「ドキュメント」に格納しそれが「コレクション」にまとめられる
Firesto 上のデータ構造38collection1コロシアムの基本情報対戦開始時ギルド情報メンバー情報イベント情報 などcollection2ユーザーの行動履歴ユーザー1行動毎ユーザーID攻撃対象ダメージ量 などcollection3 戦況状態履歴 約1秒毎全ユーザーのHPイノチ獲得量イベント状態 などcollection4 チャット 発言毎ユーザーアイコン発言内容 など
Firesto 上のデータ構造39collection1コロシアムの基本情報対戦開始時ギルド情報メンバー情報イベント情報 などcollection2ユーザーの行動履歴ユーザー1行動毎ユーザーID攻撃対象ダメージ量 などcollection3 戦況状態履歴 約1秒毎全ユーザーのHPイノチ獲得量イベント状態 などcollection4 チャット 発言毎ユーザーアイコン発言内容 など
Firesto 上のデータ構造40collection1コロシアムの基本情報対戦開始時ギルド情報メンバー情報イベント情報 などcollection2ユーザーの行動履歴ユーザー1行動毎ユーザーID攻撃対象ダメージ量 などcollection3 戦況状態履歴 約1秒毎全ユーザーのHPイノチ獲得量イベント状態 などcollection4 チャット 発言毎ユーザーアイコン発言内容 など
Firesto 上のデータ構造41collection1コロシアムの基本情報対戦開始時ギルド情報メンバー情報イベント情報 などcollection2ユーザーの行動履歴ユーザー1行動毎ユーザーID攻撃対象ダメージ量 などcollection3 戦況状態履歴 約1秒毎全ユーザーのHPイノチ獲得量イベント状態 などcollection4 チャット 発言毎ユーザーアイコン発言内容 など
Firesto 上のデータ構造42collection1コロシアムの基本情報対戦開始時ギルド情報メンバー情報イベント情報 などcollection2ユーザーの行動履歴ユーザー1行動毎ユーザーID攻撃対象ダメージ量 などcollection3 戦況状態履歴 約1秒毎全ユーザーのHPイノチ獲得量イベント状態 などcollection4 チャット 発言毎ユーザーアイコン発言内容 など
4. 発生した課題と解決方法について43
発生した課題と解決方法について44• PHP から Firestore への write時、一定のコストがかかっており• 結果 Response Time の悪化が見られた
発生した課題と解決方法について45• Firestore への write が遅延するケースがあった• PHP と Firestore を切り離すために Cloud functions を使用
発生した課題と解決方法について46• Firestore への write にかかる時間が安定しなかった• PHP と Firestore を切り離すために、下記を実施appサーバ戦況書き込みappサーバ戦況書き込み● Cloud functions○ PHP → Firestore への書き込み遅延を回避するために使用PHP から write するのではなく、Cloud Functions から write する● Cloud Pub/Sub○ Cloud functions のトリガーとして使用
発生した課題と解決方法について47• Firestore への write が遅延するケースがあった• PHP と Firestore を切り離すために Cloud functions を使用appサーバ戦況書き込みappサーバ戦況書き込み
発生した課題と解決方法について48• Cloud functions からの write に切り替えた結果Response Time は安定
発生した課題と解決方法について49• Cloud functions からの write に切り替えた結果Response Time は安定• 依然として Cloud Pub/Sub への書き込みコストがあった
発生した課題と解決方法について50• 依然として Cloud Pub/Sub への書き込みコストがあった• google-cloud-batch daemon を使用
発生した課題と解決方法について51• 依然として Cloud Pub/Sub への書き込みコストがあった• google-cloud-batch daemon を使用Requestpub/sub 書き込みdaemon未使用
発生した課題と解決方法について52• 依然として Cloud Pub/Sub への書き込みコストがあった• google-cloud-batch daemon を使用Requestpub/sub 書き込みdaemonpub/sub 書き込みqueueに書き込みRequestdaemon未使用daemon使用
発生した課題と解決方法について53• google-cloud-batch daemon で Cloud Pub/Sub への writeを行うようにした結果• Response Time が、Firestore導入前と同等まで改善
まとめ54• Cloud Firestore は以下の特徴がある• 柔軟な階層型データ構造に対応• リアルタイムアップデート• Firebase Unity SDK から扱える• Firestore への書き込み時に一定のコストが発生したがCloud functions, batch daemon を使用することで書き込み時のコストを抑えることが出来た
55