Cloud Spanner によるマルチプレーヤー型ゲームの構築
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 は、データを探索、共有、可視化できる強力なビジネス インテリジェンス プラットフォームです。


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 を使用して行われます。


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


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


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

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


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


まとめ
高可用性と強整合性を備えた分散型データベース Spanner は、マルチプレーヤー型ゲーム開発に最適なデータベースとなっています。多くのゲーム制作会社やゲーム デベロッパーが、堅牢なバックエンドを提供するデータベースとして Cloud Spanner に信頼を寄せています。Cloud Spanner を利用することで、魅力的なゲームの制作という本来の作業に集中して取り組むことができます。
ゲームの ER 図はこちらをご覧ください。Google Cloud の既存のお客様、および新規のお客様いずれも Spanner の無料トライアル インスタンスをご利用いただけます。費用は一切かかりません。
Spanner の利用方法、特にゲームでの活用方法について詳しくは、以下をご覧ください。
ゲームサーバーのバックエンドとしての Cloud Spanner
このブログ投稿に協力してくれたデータベース(Google Cloud)担当グループ プロダクト マネージャー Aalok Muley に感謝します。
- Nevius Solution、シニア ソリューション アーキテクト、Sagar Vaidya 氏




