サーバーレス非同期マルチプレイヤーのリファレンス アーキテクチャ

アーキテクチャの図

A同期マルチプレイヤーのアーキテクチャの図

アーキテクチャのサービス

  • Azure Functions - 小規模なマッチメイキング ロジックを実行するために使用されます。 消費計画を使用する場合、関数の定義は File Storage に保存されるため、ストレージ アカウントを作成する必要があります。 最適なパフォーマンスを得るには、関数と同じリージョンのストレージ アカウントを使用する必要があります。
  • Azure Database for MySQL - 速く、軽量で、信頼性が高く、コスト効果がよいので、情報を格納するために使用されます。
  • 通知ハブ - 多数のプラットフォーム (iOS、Android、Windows、Kindle、Baidu など) に通知を送信できる、使いやすい、スケールアウトされたプッシュ エンジンです。
  • SignalR - HTTP を介してアプリケーションにリアルタイム Web 機能を追加するプロセスを簡素化し、接続されているクライアント デバイスにデータをプッシュできるようにします。
  • Key Vault - データベース接続文字列など、シークレットを管理するのに最適なサービスです。

設計時の考慮事項

この特定のリファレンス アーキテクチャでは、シンプルなサーバーレスの三目並べゲームを示します。

このリファレンス アーキテクチャでは、ヘルパー クラス (データ クライアント) はデータベースに接続して対話し、他の関数は必要に応じてそれを使用します。 ゲーム セッション クラスは、プレイヤーによって送信された情報を使用してターンを実行するため、および勝者を計算するために使用されます。 次の 3 つの異なるアクション イベントがサポートされています: forfeit (ゲームを投了する)、addPlayer (プレイヤーをゲーム セッションに参加させる)、takeTurn

デプロイ テンプレート

Azure サービスの名前付け規則と制限事項をまとめたセクションが含まれる一般的なガイドライン ドキュメントを参照してください。

注意

ARM テンプレートの動作に興味がある場合は、このリファレンス アーキテクチャで利用されている各サービスの Azure Resource Manager テンプレートのドキュメントを参照してください。

警告

データベース管理者のパスワードには、8 から 128 文字にする必要があります。 また、次のカテゴリのうち 3 種の文字が含まれている必要があります: アルファベット大文字、アルファベット小文字、数字 (0-9)、英数字以外の文字 (!、$、#、% など)。

ヒント

Azure Functions をローカル環境で実行するには、local.settings.json ファイルをこれらの同じアプリ設定で更新します。

ステップ バイ ステップの手順

新しいゲーム セッションを作成する

  1. クライアント デバイスは、プレイヤーが選択したゲームの設定をフォーマットし、バックエンドにゲーム セッション開始イベントを送信した後、応答を待機します。
  2. バックエンドは、新しいゲーム セッションを開始するコマンドを受信します。 バックエンドは、最初に、プレイヤーの設定と一致する既存のゲーム セッションの検索を試みます。
  3. マッチメイキング用に適切なゲーム セッションが利用できない場合は、新しいゲーム セッション オブジェクトが作成されます。
  4. 新しい永続的オーケストレーター関数が作成されます。
  5. 永続的オーケストレーター関数は、ゲーム セッション オブジェクトを読み取り、少なくとも 2 人のプレイヤーがゲーム セッションに参加するまで待機します
  6. 最初のプレイヤーによって選択されたものと同じ設定を持つ別のプレイヤーが、バックエンドにゲーム セッション開始イベントを送信します。
  7. バックエンドがコマンドを受信し、既存のゲームの検索を試みます。 この場合は、以前に作成されたゲーム セッションが見つかります
  8. 永続的オーケストレーター関数は、addPlayer イベントを受け取り、ゲーム セッションに参加するプレイヤーが 2 人になったので待機を停止します。
  9. 永続的オーケストレーター関数は、マッチを正式に開始し、ゲームの状態を進行中に設定して、プレイヤーの 1 人をランダムに選んで開始します。 一言で言えば、オーケストレーターはゲームのロジックを実行し、ゲームの状態を更新する責任を負います。
  10. 永続的オーケストレーター関数は、データベースにデータを保持する操作をトリガーします。 データ クライアント ヘルパー クラスを利用して、データを保持するためにデータベースに接続します。
  11. 永続的オーケストレーター関数は、ゲーム セッションのロジックを実行し、次のプレイヤーのターンであることを返します。
  12. ゲームの状況 (誰かのターン、誰かの勝ち、誰かの投了など) に基づいて、1 人または複数のプレイヤーへの通知をキューに入れます
  13. その後、永続的オーケストレーターは、新しいゲーム状態で自分自身を呼び出し、次のイベントの受信を待ちます。
  14. クライアント デバイスは、ゲーム セッションを管理するオーケストレーター関数の一意の識別子を含む通知を受け取ります。
  15. クライアント デバイスは、通知で受け取った永続的オーケストレーターの一意の識別子が含まれるゲーム セッション読み込みイベントをバックエンドに送信します。
  16. バックエンドは、ゲーム セッションを読み込むコマンドを受け取り、クライアント デバイスによって表示されるゲーム セッションの詳細を返します。
  17. プレイヤーは、X または O を永続的オーケストレーター関数に直接送信し、ターンを終了します。

プレイヤー ゲーム リストを要求する

  1. クライアント デバイスは、セッションのリストの取得コマンドをバックエンドに送信します。
  2. バックエンドは、データベースのクエリを実行して要求を処理し、データをクライアント デバイスに送信します。 クエリによって返される結果の数を制限し、結果を並べ替えることを検討します。
  3. クライアント デバイスは、バックエンドの応答を受け取り、そこに含まれるデータを使用して、関連する UI を設定します。

実装サンプル

読者のための演習

提供されているサンプルには、データベースからの読み取りをスケーリングするロジックは含まれず、書き込みのみが含まれています。 データベースへの接続が使い果たされるのを防ぐため、データベースの前面にキャッシュを配置するか、データベースをスケールアップすることを検討してください。

セキュリティに関する考慮事項

データベースの接続文字列を、関数のソースにハードコーディングしないでください。 代わりに、少なくとも、関数アプリの設定を利用するか、より強力なセキュリティのためには、代わりに Key Vault を使用します。 キー コンテナーを作成する方法、関数でマネージド サービス ID を使用する方法、および最後に関数から Key Vault に格納されているシークレットを読み取る方法について説明されているチュートリアルがあります。

代替手段

このリファレンス アーキテクチャでは、Azure Database for MySQL が使用されていますが、Azure SQL Databaseまたは Azure Database for PostgreSQL に置き換えることができます。

その他のリソースとサンプル

永続的関数と Azure SignalR Service を使用した雑学ゲーム

TAzure SignalR Service と永続的関数を使用した雑学ゲーム

完全に非同期ではありませんが (20 秒のタイマーで実行されます)、永続的関数と Azure SignalR Service で構築された雑学ゲームの実装を、こちらのリンクで見つけることができます。 ヒントは jservice.io から取得されます。 実行しているところを確認するには、こちらのリンクを参照してください。

しくみは次のとおりです。

  1. 雑学ゲームのホストが、デプロイ時に、または Web 要求経由で、HttpStartSingle Azure 関数を呼び出して、ゲームを開始します。
  2. Azure 関数が、TriviaOrchestrator 永続的 Azure 関数を開始します。
  3. プレイヤーがゲームに参加します。 アプリを実行している各プレイヤーのクライアント デバイスが、バックエンドから Azure SignalR Service ハブの詳細を取得します。 バックエンドが、SignalRInfo Azure 関数経由で要求を受け取ります。 関数バインドにより、接続文字列のキーを使用してトークンが生成され、クライアント デバイスに送信されます。 クライアント デバイスは、リッスンする Azure SignalR Service からの 2 つのイベントを設定します: newCluenewGuess
  4. バックエンドで、TriviaOrchestrator 永続的 Azure 関数によって、GetAndSendClue 永続的アクティビティ Azure 関数が呼び出されます。
  5. TriviaOrchestrator 永続的 Azure 関数によって、20 秒ごとに自分自身を呼び出すタイマーが設定されます。これは、プレイヤーが雑学のヒントに応答するまでの時間の長さです。
  6. GetAndSendClue 永続的アクティビティ Azure 関数により、jservice.io サービスから雑学のヒントが取得されます。
  7. その後、雑学のヒントが、ターゲット newClue を使用して、接続されているすべてのユーザーに対し、Azure SignalR Service によって配信されます。
  8. プレイヤーは、Azure SignalR Service から雑学のヒントを受け取り、回答を考えます。
  9. バックエンドは、SubmitGuess Azure 関数経由でプレイヤーの応答を受け取ります。
  10. この Azure 関数は、プレイヤーによって送信された回答が正しいかどうかを計算します。 その後、結果が、ターゲット newGuess を使用して、接続されているすべてのユーザーに対し、Azure SignalR Service によって配信されます。
  11. クライアント デバイスは、Azure SignalR Service からの応答を受け取り、正しい回答または間違えた回答の数を更新します。

価格設定

Azure サブスクリプションをお持ちでない場合は、無料アカウント を作成して 12 か月間の無料サービスの利用を開始できます。 それらのサービスの制限を超えない限り、Azure 無料アカウントで無償で提供されているサービスに対して料金が発生することはありません。 Azure Portal または使用状況ファイルを通じて使用状況を確認する方法について説明します。

これらのリファレンス アーキテクチャの実行中に使用される Azure サービスのコストはユーザーが負担します。 その合計は使用状況によって異なります。 リファレンス アーキテクチャで使用されていた各サービスの価格は、Web ページで確認ください。

また、Azure の料金計算ツールを使用して、使用する予定の Azure サービスのコストを構成および見積もることもできます。