コンテンツに移動
Gaming

Cloud Spanner によるマルチプレーヤー型ゲームの構築

2023年3月27日
https://storage.googleapis.com/gweb-cloudblog-publish/images/gaming_2022_KeCqWW5.max-2500x2500.jpg
Google Cloud Japan Team

※この投稿は米国時間 2023 年 3 月 22 日に、Google Cloud blog に投稿されたものの抄訳です。

ファンタジー スポーツ ゲームは、現実のデータに基づいて作られたライブサービス ゲームです。データは、現実のスポーツリーグ、統計情報を公開するウェブサイト、報道機関などのさまざまなソースから収集されます。プレーヤーは、これらのデータをもとに作り上げられた仮想的な世界で選手を集めてチームを結成し、リアルタイムで世界中の対戦相手と勝負します。

このようなゲームは、低レイテンシが求められること、ワークロードが大きく変動すること、ゼロ ダウンタイムのアーキテクチャが必要となることが特徴です。また、快適なゲームプレイを実現するには、信頼性が高く、世界中から利用でき、変動するワークロードにも迅速に対応できる堅牢なデータベースが必要です。

Niveus は、ワークロードのデジタル トランスフォーメーションを通してカスタマー エクスペリエンスを高めると同時に、市場での差別化を図る企業のサポートを専門とする Google Cloud パートナーです。先日、Niveus のチームは、Cloud Spanner を評価するために、ファンタジー スポーツ ゲームのデモを作成しました。ここでは、このワークロードで Spanner がどのように活用されたかをご紹介します。

リアルタイムのマルチプレーヤー型ゲームで Cloud Spanner を検討する理由

  • グローバルに分散されたスケーラブルなデータベース: Spanner はグローバルに分散されたデータベースであるため、複数のリージョンにわたってサービスを提供できます。Spanner のアーキテクチャでは、コンピューティングがストレージから分離されており、ストレージとは独立した形でコンピューティング リソースをスケールできます。そのため、柔軟性、パフォーマンス、信頼性の向上、そしてコスト削減を実現できます。分散型データベースなので、オンライン ゲームのようにワークロードが全世界で発生し、しかも予測不可能な場合に最適なデータベースとなっています。Spanner は無限ともいえるスケーラビリティを備えているため、ゲームの人気が急に高まった場合でも、急増するワークロードに容易に対応できます。

  • トランザクションの整合性と強整合性: Spanner は ACID トランザクションをサポートしているため、数百万人ものプレーヤーのアクションの安全性と整合性を保つことができ、ゲームの状態に関する信頼できる唯一の情報源となります。Spanner はデフォルトで、「強整合性」を維持した読み取りを保証します。つまり、オペレーションの開始前にすべてのトランザクションの効果を観察します。データの分散状況や、ノードの障害の有無にかかわらず整合性が保たれます。このような整合性は、ゲームデータの保存やゲーム内のトランザクションにとって重要となります。

  • 高可用性: Spanner では 99.999% の稼働時間とメンテナンスの時間枠ゼロが実現します。そのため、ゲーマーが求める応答性と稼働時間の高い基準を満たすことができます。

このように他のデータベースにはない機能を備えているため、Niantic、バンダイナムコ、Embark Studios など複数のゲーム制作会社のお客様が、バックエンドのゲーム データベースとして Spanner を利用しています。詳しくは、ゲーム向けデータベースのページをご覧ください。

ファンタジー スポーツ リーグ(FSL)ゲームの実装

スポーツリーグでの対戦は、ファンタジー チームの結成から始まります。各ゲーマーは、次に開催されるクリケットの試合に向けて、2 つのライバルチームから選手を選びます。さまざまなゲーム アクティビティに応じてポイントが与えられます。ゲームが行われている間、スコアボードにリアルタイムの情報が掲示され、試合の最後に最も多くのポイントを獲得しているファンタジー チームが勝者となります。

マルチプレーヤー型ゲームでは、ゲーマーが行う各アクティビティについて読み取り / 書き込みオペレーションが必要になるほか、そのデータ(ID、ユーザー名、パスワード、ゲーマーのファンタジー チームのプレーヤー、プレーヤーのデータなど)を保存する必要があります。システムには、ゲーマーに関する基本的な詳細情報に加えて、バックエンドのゲームデータと、スコアボードのスナップショットなどの派生データも保存する必要があります。マルチプレーヤー型ゲームの人気が急に高まると、ユーザー数が一気に増加し、コンピューティングとストレージに非常に大きな負荷がかかります。MySQL などのデータベースでこのような状況に対処するには、デベロッパーがシャーディングされた環境を作成、デプロイ、保守する必要があります。しかしこのような作業は複雑で難しく、費用も膨らみます。一方、Spanner データベースなら、自動的にデータのシャーディングが行われ、コンピューティングの負荷に応じて処理が分散されます。レプリケーションの管理も行われるため、データベースがダウンすることがなく、ゲーマーが快適にプレイすることができます。

このゲームでは、アプリケーション レイヤに Node JS を、バックエンドのゲーム データベースとして Spanner を、スコアボードのデータを保存するキャッシュ レイヤとして Cloud Memorystore を使用しています。

ゲームをデプロイする場合、分析も重要な要素となります。ここでは Spanner 上でゲームを実行することに主眼を置いてコードを記述しましたが、このアーキテクチャを拡張し、分析の要素を取り入れることもできます。収集されたゲームデータに対する分析では、Dataflow、BigQuery、Looker を利用することができます。このアーキテクチャでは、Spanner の変更ストリームを使用して、BigQuery にデータを pull しています。BigQuery は、大規模なデータセットを保存および分析するための、スケーラブルで信頼性が高く、セキュアなクラウドベースのデータ ウェアハウスです。Looker は、データを探索、共有、可視化できる強力なビジネス インテリジェンス プラットフォームです。

https://storage.googleapis.com/gweb-cloudblog-publish/images/IMG_1_Architectural_Diagram.max-1900x1900.jpg
アーキテクチャの概要

Spanner 上で開発したゲームをデプロイし、性能をテストしました。ゲームのソースコードをご覧ください。

コードには、開発した以下のようなマイクロサービスが含まれています。

  • FSL-Backend-Common - 他のマイクロサービスが使用するメソッドやユーティリティがいくつか含まれています。

  • FSL-MS-Resource-Management - チーム、試合、プレーヤー、ファンタジー チームの詳細など、テーブル用の CRID オペレーションのエンドポイントを処理します。

  • FSL-MS-Simulator - 試合のシミュレーションを行います。

  • FSL-MS-Update-Leaderboard - 各ファンタジー チームのスコアを計算し、Memorystore 内のスコアボードを更新します。

  • FSL-MS-Display-Leaderboard - 試合のスコアボード データを表示します。

試合のシミュレーション

FSL-MS-Simulator マイクロサービスには、個々のボールと試合をシミュレートする API が含まれています。ボールのシミュレーションには、/simulateBall API が使用されます。同様に、試合全体のシミュレーションは、/simulateMatch を呼び出し、試合シミュレーション API を使用して行われます。

https://storage.googleapis.com/gweb-cloudblog-publish/images/IMG_2updatingScore_wth_Pub_Sub_1.max-1000x1000.jpg

SimulateBall は、Pub/Sub トピック simulatorListener および updateScore にメッセージを push します。UpdateScoreListener は Pub/Sub からデータパケットを受信し、/updateScore API を呼び出します。この API は、固定長のバッチを作成してupdateRedis Pub/Sub トピックに push し、大量のデータ処理を並列実行します。

https://storage.googleapis.com/gweb-cloudblog-publish/images/IMG_3MatchSimulation_Update_score_flow_1.max-1200x1200.jpg

スコアの更新

試合の進行とともに各チームのスコアが Memorystore に蓄積され、この情報に基づきスコアが計算されます。Memorystore でスコアが更新されると、Spanner でも更新が行われます。大量の書き込みを処理できるよう、数多くのサブスクライバーが用意されます。データはこれらすべてのサブスクライバーがリッスンする Pub/Sub に push され、イベントがパブリッシュされて、Spanner への書き込みが開始されます。

https://storage.googleapis.com/gweb-cloudblog-publish/images/IMG_4Leaderboard_SpannerUpdateFlow.max-1400x1400.jpg

Spanner へのスコアボード データの保存

最後のボールの処理が終わると、スコアボードのスナップショットを Spanner で更新します。これにより、試合終了後にサイトを訪問したユーザーは、試合の最終的なスコアボードを見られるようになります。将来的には、保存されたデータに基づいて ML モデルを構築し、ユーザーのスコアと勝者を予測することもできるようにする予定です。
https://storage.googleapis.com/gweb-cloudblog-publish/images/IMG_5MatchSimulation_ScoreIUpdates.max-1000x1000.jpg

スコアボード

ファンタジー チームはスコアボードに掲示され、スコアに基づいてランキングされます。各チームのスコアは Memorystore で計算されます。試合が行われている間、すべての書き込みがキャッシュに対して行われ、リアルタイムのスコアボード情報は Memorystore から取得されます。

https://storage.googleapis.com/gweb-cloudblog-publish/images/IMG_6Get_LeaderboardScore_ToMemoryStore.max-700x700.jpg

シミュレーション後の結果

シミュレーションが終わったら、上位 10 のファンタジー チームを Spanner の contestDetails テーブルと MatchResults テーブルに保存します。

https://storage.googleapis.com/gweb-cloudblog-publish/images/IMG_7Get_LeaderboardScore-Spanner.max-700x700.jpg

まとめ

高可用性と強整合性を備えた分散型データベース Spanner は、マルチプレーヤー型ゲーム開発に最適なデータベースとなっています。多くのゲーム制作会社やゲーム デベロッパーが、堅牢なバックエンドを提供するデータベースとして Cloud Spanner に信頼を寄せています。Cloud Spanner を利用することで、魅力的なゲームの制作という本来の作業に集中して取り組むことができます。

ゲームの ER 図はこちらをご覧ください。Google Cloud の既存のお客様、および新規のお客様いずれも Spanner の無料トライアル インスタンスをご利用いただけます。費用は一切かかりません。

Spanner の利用方法、特にゲームでの活用方法について詳しくは、以下をご覧ください。


このブログ投稿に協力してくれたデータベース(Google Cloud)担当グループ プロダクト マネージャー Aalok Muley に感謝します。


- Google Cloud、テクニカル アカウント マネージャー、Sarun Singla
- Nevius Solution、シニア ソリューション アーキテクト、Sagar Vaidya 氏
投稿先