Slide 1

Slide 1 text

株式会社コロプラ 大規模トラフィックを支える ゲームバックエンドの課題と構成の変遷 ~安定したゲーム体験を実現するために~ 2024.11.26

Slide 2

Slide 2 text

仲山 悠也 株式会社コロプラ サーバー基盤グループ LCEチーム バックエンドエンジニア 自己紹介

Slide 3

Slide 3 text

コロプラについて

Slide 4

Slide 4 text

コロプラについて Vision 行動指針 エンターテインメントで日常をより楽しく、より素晴らしく Mission

Slide 5

Slide 5 text

コロプラについて

Slide 6

Slide 6 text

最新作

Slide 7

Slide 7 text

本題

Slide 8

Slide 8 text

アジェンダ 1 スマートフォンゲームの構成について 2 昔のアーキテクチャのお話 3 少し昔のアーキテクチャのお話 4 最近のアーキテクチャのお話

Slide 9

Slide 9 text

スマートフォンゲームとは スマホやタブレットなどのモバイル端末上で動作するゲーム ▶ 特徴 ► 高い携帯性 ► いつでもどこでも手軽にプレイ可能 ► ソーシャル要素 ► 他のプレイヤーとの協力、対戦、交流が可能 ► 継続的なコンテンツ配信 ► インターネット接続を活かして新しいコンテンツを提供

Slide 10

Slide 10 text

Web アプリケーションとほとんど同じ構造 スマートフォンゲームの主要コンポーネント API サーバー Request Response クライアント 言語:C#

Slide 11

Slide 11 text

より楽しいゲーム体験を実現するために リアルタイムな通信を実現するための専用のサーバーが存在する場合がある リアルタイムサーバー クライアント 言語:C#

Slide 12

Slide 12 text

より楽しいゲーム体験を実現するために

Slide 13

Slide 13 text

より楽しいゲーム体験を実現するために

Slide 14

Slide 14 text

より楽しいゲーム体験を実現するために ・移動したよ! ・敵を倒した! ・ターンエンド!

Slide 15

Slide 15 text

より楽しいゲーム体験を実現するために

Slide 16

Slide 16 text

より楽しいゲーム体験を実現するために

Slide 17

Slide 17 text

より楽しいゲーム体験を実現するために 専用ゲームサーバー(DGS)

Slide 18

Slide 18 text

スマートフォンゲームの主要コンポーネント API サーバー Request Response クライアント 言語:C# リアルタイムサーバー(DGS)

Slide 19

Slide 19 text

具体例

Slide 20

Slide 20 text

年表 2014 2016 2018 2020 2022 2024 指一本で本格的な アクションゲーム! 現実が ドラゴンクエストの世界に! シンプル操作で リアルなゴルフ体験! 5分でサクッと チームバトル! モバイルでの リアルタイム対戦!

Slide 21

Slide 21 text

約10年前のアーキテクチャ

Slide 22

Slide 22 text

事件発生

Slide 23

Slide 23 text

スマートフォンゲームのアクセスパターン 新作ローンチ時やイベントリリース時は急激にアクセスが増加

Slide 24

Slide 24 text

当時よく発生した問題 急激に伸びるユーザー数 データ量及びクエリの増加によるデータベースの負荷の急上昇 データベースが詰まって接続が不安定に...

Slide 25

Slide 25 text

当時の対応 ▶ 全く同じスキーマの DB インスタンスを後から追加することで対応 ► 時間がない中で、とにかく対応に追われて実施した苦肉の策 ► 本来不要なゲームの設定データなどもまとめて追加

Slide 26

Slide 26 text

当時の対応 ▶ 全く同じスキーマの DB インスタンスを後から追加することで対応 ► 時間がない中で、とにかく対応に追われて実施した苦肉の策 ► 本来不要なゲームの設定データなどもまとめて追加 ? API サーバー

Slide 27

Slide 27 text

当時の対応 ▶ 全く同じスキーマの DB インスタンスを後から追加することで対応 ► 時間がない中で、とにかく対応に追われて実施した苦肉の策 ► 本来不要なゲームの設定データなどもまとめて追加 ▶ シャーディングによる負荷分散 ► 分割数の事前の試算が難しい ► アプリケーションコードの複雑化を招く ► オペレーションコスト増大 後発のゲームタイトルでは...

Slide 28

Slide 28 text

当時の課題 データベースをなんとかして 運用コストを下げたい!

Slide 29

Slide 29 text

年表 2018 2020 2014 2016 2022 2024 指一本で本格的な アクションゲーム! 現実が ドラゴンクエストの世界に! シンプル操作で リアルなゴルフ体験! 5分でサクッと チームバトル! モバイルでの リアルタイム対戦!

Slide 30

Slide 30 text

約5年前のアーキテクチャ Google Cloud Kubernetes Cluster Monitoring Prometheus Queue Workers GKE Pods Queue RabbitMQ (VM) Master Data MySQL (VM) Multiple Replicas Cache Memory Store API Gateway Load Balancer KPI Analytics BigQuery Logs Cloud Logging LB Phone Google認証 Cloud IAP Admin Server GKE Pods Visualization Grafana User Search Elasticsearch API Servers GKE Pods Twemproxy LB 管理者 Admin Pubsub Redis User Data Cloud Spanner

Slide 31

Slide 31 text

実質的に無制限のスケーリング 変更: ユーザーデータに Spanner を採用  ※ Spanner については別のカンファレンスで詳しく話したものがあります Google Cloud の分散型データベース ▶ ボタンひとつでスケールイン・スケールアウト ► オペレーション、運用にかかるコストの削減 ▶ コード側でシャーディングを意識する必要性が少ない ► アプリケーションコードのメンテナンス性の向上 ▶ ゼロダウンタイム ► コロプラの運用ポリシーと相性良し

Slide 32

Slide 32 text

変更: ワークロードの実行基盤に GKE を採用 コンテナ型仮想化の台頭 Kubernetes の仕組みに乗ることで ● ホストエラー発生時の対応 ● 自前のデプロイスクリプトの管理 ● 自前のサーバー台数管理システム などから解放され、運用コストがおよそ半分に! また、 Infrastructure as Code を推進することでインフラ構成を文章化し、 運用・管理・オンボーディングなどのコスト削減!

Slide 33

Slide 33 text

効果 最大規模のタイトルの 安定運用に成功! ここ5年間で大きな サービスダウンはなし!

Slide 34

Slide 34 text

この頃の社内におけるアーキテクチャ選定の考え Google Cloud + GKE + Spanner は大成功! 今後の新作もこの組み合わせでやっていく!

Slide 35

Slide 35 text

一方その頃に開発中の新作タイトルは... 対戦! 対戦! 2018 2020 2014 2016 2022 2024 指一本で本格的な アクションゲーム! 現実が ドラゴンクエストの世界に! シンプル操作で リアルなゴルフ体験! 5分でサクッと チームバトル! モバイルでの リアルタイム対戦!

Slide 36

Slide 36 text

社内で高まる気運 社内のニーズ 対戦型のゲームをうまく効率よく作っていきたい! 対戦型ゲームの要件 プレイヤーの操作をリアルタイムにゲーム内に反映 帰結 リアルタイムサーバーの活用が重要!

Slide 37

Slide 37 text

当時リアルタイムサーバーで抱えていた課題 ▶ デプロイが大変 ► プロトコルが常時接続 ► 更新起因で切断されるとゲームがプレイできなくなる ► 何か工夫が必要 ► サーバー管理が手動 ► 事前にサーバーを用意し、接続先を登録 ► キャパシティプランニングが難しい ▶ なるべくデプロイをしない ► 「リアルタイムサーバーにロジックを入れない」となりがち

Slide 38

Slide 38 text

当時リアルタイムサーバーで抱えていた課題 ▶ 属人化 ► 高度な専門性を必要とするので、対応者が偏りがち ► チーム内の有識者が都度対応 ▶ 組織としての柔軟性が欠如 ► 個人に知識が集中 ► 進捗が個人の課題解決能力に依存

Slide 39

Slide 39 text

組織的なアーキテクチャの変更 Realtime Platform Engineering (RTPE) チームが誕生! ▶ リアルタイム通信基盤を支える中心となるチーム ► 高度な専門性でマルチプレイヤーゲームの開発をリード ► 初期からマルチの開発に関わり、ノウハウを蓄積 ► ベストプラクティスの共有などの情報発信 ► 基盤ライブラリの整備 ► ゲームの性質に応じて複数の選択肢を提供 ► 新技術研究 ► PoC(Proof of Concept:概念実証) ► プロトタイピング ※ 気になった方はぜひブースにも遊びに来てください!

Slide 40

Slide 40 text

年表 指一本で本格的な アクションゲーム! 現実が ドラゴンクエストの世界に! シンプル操作で リアルなゴルフ体験! 5分でサクッと チームバトル! 2022 2024 2014 2016 2018 2020 モバイルでの リアルタイム対戦!

Slide 41

Slide 41 text

最新のアーキテクチャ

Slide 42

Slide 42 text

変更: DGS の管理に Agones を採用 ● GoogleForGames に含まれるオープンソースプロジェクト ● Kubernetes の拡張で、DGS の管理機能を追加 ● カスタムリソース / コントローラー / SDK などを提供 What is Agones? オープンソースで、必要なものがすべて揃った、マルチプレイヤー専用ゲー ムサーバーのスケーリングとオーケストレーションプラットフォームであり、 Kubernetes が動作する場所ならどこでも実行できます。 ※ https://agones.dev/site/

Slide 43

Slide 43 text

変更: DGS の管理に Agones を採用 クライアント API サーバー リアルタイムサーバー (DGS) A B C 従来までの動き

Slide 44

Slide 44 text

変更: DGS の管理に Agones を採用 クライアント API サーバー リアルタイムサーバー (DGS) A B C ふたりで遊びたい! 従来までの動き

Slide 45

Slide 45 text

変更: DGS の管理に Agones を採用 クライアント API サーバー リアルタイムサーバー (DGS) A B C ・稼働中の DGS がある? ・ルールに適している? ・キャパ的に大丈夫? 従来までの動き

Slide 46

Slide 46 text

変更: DGS の管理に Agones を採用 クライアント API サーバー リアルタイムサーバー (DGS) A B C C を使って! 従来までの動き

Slide 47

Slide 47 text

変更: DGS の管理に Agones を採用 クライアント API サーバー リアルタイムサーバー (DGS) A B C 従来までの動き

Slide 48

Slide 48 text

変更: DGS の管理に Agones を採用 クライアント API サーバー リアルタイムサーバー (DGS) A B C ・稼働中の DGS がある? ・ルールに適している? ・キャパ的に大丈夫? 従来までの動き

Slide 49

Slide 49 text

変更: DGS の管理に Agones を採用 クライアント API サーバー リアルタイムサーバー (DGS) A B C ・稼働中の DGS がある? ・ルールに適している? ・キャパ的に大丈夫? 従来までの動き 実装が大変!

Slide 50

Slide 50 text

変更: DGS の管理に Agones を採用 クライアント API サーバー リアルタイムサーバー (DGS) A B C 従来までの動き

Slide 51

Slide 51 text

変更: DGS の管理に Agones を採用 クライアント API サーバー リアルタイムサーバー (DGS) A B C 従来までの動き  DGS の管理を肩代わり

Slide 52

Slide 52 text

変更: DGS の管理に Agones を採用 クライアント API サーバー リアルタイムサーバー (DGS) A B C Agones 導入後の動き

Slide 53

Slide 53 text

変更: DGS の管理に Agones を採用 クライアント API サーバー リアルタイムサーバー (DGS) A B C ふたりで遊びたい! Agones 導入後の動き

Slide 54

Slide 54 text

変更: DGS の管理に Agones を採用 クライアント API サーバー リアルタイムサーバー (DGS) A B C DGS ください Agones 導入後の動き

Slide 55

Slide 55 text

変更: DGS の管理に Agones を採用 クライアント API サーバー リアルタイムサーバー (DGS) A B C C を割り当てました Agones 導入後の動き

Slide 56

Slide 56 text

変更: DGS の管理に Agones を採用 クライアント API サーバー リアルタイムサーバー (DGS) A B C C を使って! Agones 導入後の動き

Slide 57

Slide 57 text

▶ 自前でサーバーを管理する必要がなくなる ► 用意された API 経由で DGS が確保されて接続先を返してくれる ► 利用された分は自動でプロビジョニング ► 常に一定のサーバーを自動で確保 変更: DGS の管理に Agones を採用 ▶ 運用オペレーションが減る ► Kubernetes の恩恵を丸ごと受けられる ▶ サーバーの状態を管理して柔軟に動作 ► 状態 (Creating, Ready, Allocated...)を管理 ► デプロイ時に使用中の DGS は影響を受けない ► ゲームを楽しんでくれているユーザー様への悪影響を心配しなくて良い

Slide 58

Slide 58 text

変更: DGS の管理に Agones を採用 クライアント API サーバー リアルタイムサーバー (DGS) A B C ❓

Slide 59

Slide 59 text

▶ 対戦型のゲームでは、一緒に遊ぶプレイヤーをどうやって見つけてくるかと いう問題は非常に重要 ► 全然レベル感の違うプレイヤー同士で対戦させられると双方にとって不都合 ► 適切な相手をずっと探し続けて全然遊べないのは困る ▶ マッチングロジックは非常に複雑化しがち ► レベル、ランク、レーティング、ルール的な制約...etc ▶ これまでは API サーバー(PHP)に実装 ► 仕組み作りから入らないといけないのが辛い ► 密結合な実装により、運用が進むにつれて保守が大変に マッチメイキングの課題

Slide 60

Slide 60 text

変更: マッチメイキングに Open Match を採用 ● こちらも GoogleForGames のオープンソースプロジェクト ● Google と Unity が中心となって発足 ● クラウドネイティブなマッチメイキングフレームワーク ○ Kubernetes 上で動かすことが前提 ○ マイクロサービスアーキテクチャを採用 ○ 高い柔軟性を備え、マッチングロジックの実装に集中できる What is Open Match? Open Match は、ゲームに合わせてスケーリング可能な 柔軟なマッチメイキングシステムです。 ※ https://open-match.dev/site/

Slide 61

Slide 61 text

変更: マッチメイキングに Open Match を採用

Slide 62

Slide 62 text

変更: マッチメイキングに Open Match を採用 試合したい

Slide 63

Slide 63 text

変更: マッチメイキングに Open Match を採用 チケット作成

Slide 64

Slide 64 text

変更: マッチメイキングに Open Match を採用 マッチング対象チケット登録

Slide 65

Slide 65 text

変更: マッチメイキングに Open Match を採用 定期的にマッチ要求

Slide 66

Slide 66 text

変更: マッチメイキングに Open Match を採用 トリガー

Slide 67

Slide 67 text

変更: マッチメイキングに Open Match を採用 チケット要求

Slide 68

Slide 68 text

変更: マッチメイキングに Open Match を採用 チケット取得

Slide 69

Slide 69 text

変更: マッチメイキングに Open Match を採用 チケット返却

Slide 70

Slide 70 text

変更: マッチメイキングに Open Match を採用 マッチ候補リストアップ

Slide 71

Slide 71 text

変更: マッチメイキングに Open Match を採用 マッチ候補返却

Slide 72

Slide 72 text

変更: マッチメイキングに Open Match を採用 マッチ候補提出

Slide 73

Slide 73 text

変更: マッチメイキングに Open Match を採用 評価依頼

Slide 74

Slide 74 text

変更: マッチメイキングに Open Match を採用 評価結果

Slide 75

Slide 75 text

変更: マッチメイキングに Open Match を採用 マッチ結果

Slide 76

Slide 76 text

変更: マッチメイキングに Open Match を採用 マッチ結果返却

Slide 77

Slide 77 text

変更: マッチメイキングに Open Match を採用 DGS 割り当て

Slide 78

Slide 78 text

変更: マッチメイキングに Open Match を採用 チケット更新依頼

Slide 79

Slide 79 text

変更: マッチメイキングに Open Match を採用 チケット更新

Slide 80

Slide 80 text

変更: マッチメイキングに Open Match を採用 次のリクエストで マッチしたチケットを返却

Slide 81

Slide 81 text

変更: マッチメイキングに Open Match を採用

Slide 82

Slide 82 text

変更: マッチメイキングに Open Match を採用 Match Profile の定義 マッチングロジック

Slide 83

Slide 83 text

変更: マッチメイキングに Open Match を採用 ❓

Slide 84

Slide 84 text

変更: マッチメイキングに Open Match を採用

Slide 85

Slide 85 text

変更: マッチメイキングに Open Match を採用 Application (PHP) 5年前

Slide 86

Slide 86 text

変更: マッチメイキングに Open Match を採用 今

Slide 87

Slide 87 text

変更: マッチメイキングに Open Match を採用 今 仕組み作りから始める必 要がなくなり、ゲームロ ジックの調整に集中でき るように!

Slide 88

Slide 88 text

変更: マッチメイキングに Open Match を採用 今 最近の DGS について 仕組み作りから始める必 要がなくなり、ゲームロ ジックの調整に集中でき るように!

Slide 89

Slide 89 text

変更: リアルタイムサーバーの積極的な活用 ▶ 従来のリアルタイムサーバー ► 受信したメッセージをそのまま他のユーザーに送信 ► リレーサーバー ► なるべくデプロイしたくない ► Agones で解決!

Slide 90

Slide 90 text

変更: リアルタイムサーバーの積極的な活用 ▶ 最近のリアルタイムサーバー ► 必要に応じてサーバー側でもロジックを持つ ► 一貫性の担保 / 不正検知 / データ保護などの面でメリットあり 計算

Slide 91

Slide 91 text

変更: リアルタイムサーバーの積極的な活用 ▶ 最近のリアルタイムサーバー ► 必要に応じてサーバー側でもロジックを持つ ► 一貫性の担保 / 不正検知 / データ保護などの面でメリットあり ► 用途によって複数の種類の DGS を使い分け

Slide 92

Slide 92 text

効果 DGS / マッチング の基盤作りから解放! API サーバー DGS DGS 対戦リクエストなど マッチ依頼 DGS 要求 DGS 割り当て ゲームロジックに 注力できるように!

Slide 93

Slide 93 text

年表 指一本で本格的な アクションゲーム! 現実が ドラゴンクエストの世界に! シンプル操作で リアルなゴルフ体験! 5分でサクッと チームバトル! 2022 2024 2014 2016 2018 2020 モバイルでの リアルタイム対戦!

Slide 94

Slide 94 text

今のアーキテクチャの課題と今後の展望 ▶ GKE のアップグレードが大変問題 ► 数ヶ月に一度コントロールプレーンとノードのバージョン更新 ► 本来であれば特に何も起こらないはずだが... ► 謎の IO 負荷の上昇によりサービス影響 ► GKE 側のコンポーネントが謎のエラー ► なんでも GKE とすると運用中のものを全て上げて回るのも大変 ▶ Cloud Run などのより軽量な実行基盤を検証中 ► 周辺サービスで試験的に導入 ► 運用ノウハウを蓄積し、選択肢の拡大へ

Slide 95

Slide 95 text

今のアーキテクチャの課題と今後の展望 ▶ Agones ► Kubernetes のバージョンに依存している ► GKE アップグレードに追従しないといけない ► Counters and Lists 機能を使用してリソース効率の改善 ► モバイルゲームのインフラアーキテクチャ特集にて詳しく紹介 ▶ Open Match ► open-match2 というリポジトリが作られている ► 今後の動きについて要チェック

Slide 96

Slide 96 text

まとめ 2014 2019 2024 データベースが詰まってしまう... Google Cloud + GKE + Spanner 構成へ 対戦型ゲームの開発の盛り上がりを受けて... Agones + Open Match + DGS によるマルチ開発 これからも挑戦は続く...

Slide 97

Slide 97 text

ブースにも遊びにきてね! 共に「新体験」を創る仲間、募集中!