View a markdown version of this page

GAMEREL03-BP02 ゲーム機能の疎結合を実装して、プレイヤーエクスペリエンスへの影響を最小限に抑えながら障害を処理する - ゲーム業界レンズ

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

GAMEREL03-BP02 ゲーム機能の疎結合を実装して、プレイヤーエクスペリエンスへの影響を最小限に抑えながら障害を処理する

コンポーネントのデカップリングとは、サーバーコンポーネントを可能な限り独立して動作できるように設計するという概念を指します。ゲームの一部の側面は、プレイヤーに良いゲーム内エクスペリエンスを提供するために、データをできるだけ最新の状態にする必要があるため、切り離すのは困難です。ただし、多くのコンポーネントとゲームタスクは切り離すことができます。例えば、リーダーボードと統計サービスはゲームプレイエクスペリエンスにとって重要ではなく、これらのサービスの読み取りと書き込みはゲームから非同期的に実行できます。

このベストプラクティスを活用しない場合のリスクレベル:

実装のガイダンス

問題が検出された場合は、自動または管理者が無効にできるゲームの機能の正常な低下を実装し、障害を適切に処理できるように機能に依存するアップストリームサービスを設定します。たとえば、特定のプレイヤーデータがゲームクライアント内で適切にロードされない場合は、このデータがゲームプレイエクスペリエンスにとって重要であるかどうかを検討する必要があります。そうでない場合は、プレイヤーのエクスペリエンスを中断せずにこの障害を適切に処理するようにゲームクライアントを設定します。プレイヤーが画面を再確認したときに、後でこのデータの取得を再試行することもできます。

タイムアウト、再試行、バックオフなどのロジックを使用して、エラーや障害を処理します。タイムアウトにより、システムが過度に長時間ハングしなくなります。再試行により、一時的なエラーとランダムなエラーの高可用性を実現できます。

重要なコンポーネントに疎結合できる重要でないコンポーネントを定義します。疎結合を使用すると、あるコンポーネントの障害が他のコンポーネントにカスケードされないため、システムの耐障害性が向上します。ゲーム機能にゲームサーバーまたはバックエンドへのステートフル接続が必要ない場合は、ステートレスプロトコルを実装して動的にスケーリングし、一時的な障害から回復する必要があります。HTTP/JSON API を使用して、ステートレスプロトコルと疎結合できる重要でないコンポーネントを開発します。ゲームクライアントからのネットワーク呼び出しを非同期およびノンブロッキングに実装して、パフォーマンスの低いゲーム機能やその他の依存サービスによるプレイヤーへの影響を最小限に抑えます。

疎結合によって回復性をさらに向上させるには、キューイング、ストリーミング、トピックベースのシステムなどのメッセージングサービスを、非同期で処理できるコンポーネント間で使用します。このモデルは、即時の応答を必要としないインタラクションや、リクエストが登録されたことの確認で十分であるインタラクションに適しています。このソリューションには、イベントを生成する 1 つのコンポーネントと、イベントを消費する別のコンポーネントが含まれます。2 つのコンポーネントは、point-to-pointの直接的なやり取りではなく、耐久性のあるストレージやキューイングレイヤーなどの中間コンポーネントを通じて統合されます。これにより、処理が失敗したときにメッセージを保存することで、システムの信頼性を向上させることもできます。

注文や配信メカニズムなど、さまざまなメッセージングサービスの特性が異なるため、適切なメッセージングメカニズムを調査して選択します。選択したメッセージシステムが少なくとも 1 回メッセージを配信するように、べき等なオペレーションを設計します。例えば、ゲームがプレイヤーのプレイタイム、統計、またはその他の関連データを追跡する必要がある一般的なゲームユースケースを考えてみましょう。これにより、プレイヤーの同時実行のピーク時に高い書き込みスループットのユースケースが発生する可能性があります。

信頼性の高いアーキテクチャを実装するには、プレイヤーが認識するread-after-write整合性がユースケースで必要かどうかを検討します。通常、このようなシナリオは非同期処理に適しており、リクエストが Amazon SQS などのスケーラブルで耐久性の高いメッセージキューに取り込まれ、Lambda 関数などのコンシューマーサービスを使用してバックエンドデータベースにバッチで挿入できる書き込みキューイングパターンを実装することで実現できます。このアプローチは、プレイヤーのゲームクライアント、バックエンドのウェブサーバーとアプリケーションサーバー、内部データベースシステムなど、複数の分散コンポーネント間の同期通信よりも信頼性が高くなります。また、書き込みキューからのコンシューマー処理を使用して必要に応じてこの取り込み速度を遅くできるため、バックエンドデータベースをピーク書き込みスループットに合わせてスケーリングする必要がないため、コストを削減できます。

実装手順

  • リーダーボードや統計サービスなどの重要でないコンポーネントを重要なゲームプレイ機能から切り離して、非同期オペレーションを可能にし、回復性を強化します。

  • タイムアウト、再試行、バックオフのロジックを使用して、重要ではない機能の正常なパフォーマンス低下を実装し、ゲームクライアントがプレイヤーエクスペリエンスを中断することなく障害を処理することを確認します。

  • Amazon SQS などのメッセージングシステムを使用してコンポーネント間の非同期通信を行い、高スループットのユースケースをスケーラブル、耐久性、信頼性の高い方法で処理できます。

リソース