非冪等性エンドポイント
繰り返し呼び出すと副作用がある HTTP メソッドは 非冪等性 とみなされます。 つまり、クライアントがエンドポイントを呼び出してネットワークタイムアウトが発生した場合、リソースが更新されている可能性があるにもかかわらず、ネットワークが呼び出し元に成功を通知できなかった可能性があるため、メソッドを安全に再試行することはできません。 エラーが発生した場合、クライアントは再試行する代わりに、まず呼び出しが成功したかどうかを確認するためにクエリを実行する必要があります。 呼び出しが成功していなかった場合にのみ、再試行する必要があります。 XBOX Services API では、一部の API は内部的に非冪等性エンドポイントを呼び出すものとしてマークされています。 つまり、これらのエンドポイントを呼び出した際に失敗が発生しても、API は自動的にはエンドポイントを再試行しません。 非冪等性 API の完全なリストは次のとおりです:- XblMatchmakingCreateMatchTicketAsync
- XblMultiplayerWriteSessionAsync
- XblMultiplayerWriteSessionByHandleAsync
- XblMultiplayerSendInvitesAsync
- XblSocialSubmitReputationFeedbackAsync
- XblSocialSubmitBatchReputationFeedbackAsync
冪等性メソッド
一方、冪等性 の HTTP メソッドは副作用を残しません。 これはつまり、安全に再試行できるということです。 XBOX Services API では、すべての冪等性メソッドは特定の条件下で自動的に再試行されます。 冪等性 API の完全なリストは、上記の非冪等性としてリストされていないすべての API です。リトライロジックのベストプラクティス
冪等性の呼び出しでは、次の条件で自動的に再試行する必要があります:- すべてのネットワークエラー
- 401: Unauthorized
- 408: RequestTimeout
- 429: Too Many Requests
- 500: InternalError
- 502: BadGateway
- 503: ServiceUnavailable
- 504: GatewayTimeout
内部 HTTP タイムアウトの動的な調整
XSAPI は、XblContextSettingsGetHttpTimeoutWindow の残り時間に基づいて、内部 HTTP タイムアウトを動的に調整します。 内部 HTTP タイムアウトは、OS が HTTP ネットワーク操作を中止するまでにその操作に費やす時間を制御します。 呼び出しは、XblContextSettingsGetHttpTimeoutWindow に少なくとも 5 秒残っていない限り、再試行されません。これは、呼び出しを完了するのに十分な時間を与えるためです。 このルールは最初の呼び出しには適用されないため、XblContextSettingsSetHttpTimeoutWindow を 0 に設定することは許容され、単一の呼び出しになります。 このロジックにより、XblContextSettingsGetHttpTimeoutWindow は API 呼び出しがいつ返るかについてより決定論的になります。 “Retry-After” ヘッダーが返された場合、“Retry-After” の時間に達するまでリトライは実行されません。 “Retry-After” の時間が XblContextSettingsGetHttpTimeoutWindow より後の場合、呼び出しは XblContextSettingsGetHttpTimeoutWindow の終了時に返されます。エラー処理
タイトル開発者は、すべての サービス呼び出しに対して 常に 適切なエラー処理を使用し、失敗の応答を適切に処理する必要があります。 XBOX services へのリクエストが失敗コードを返す原因となる、現実世界の状況は数多く存在します。例えば:- ネットワークが利用できない。例えば、デバイスが 4G を失った、Wi-Fi を失った、またはネットワークがダウンした。
- サービスへの負荷が高すぎる (503)。
- サービス上で障害が発生した (500)。
- サービスへ送信されたリクエストが多すぎる (429)。
- 書き込み操作の競合 (412)。例えば、マルチプレイヤーセッションの別のプレイヤーが先に変更を送信した。
- ユーザーが BAN されている、または権限を持っていない。
- ユーザーがサインアウトしている。
最適な呼び出しパターン
バッチリクエストを使用する
一部のエンドポイントは、一連のリクエストのバッチ処理または集約を単一の呼び出しへまとめることをサポートしています。 例えば、XBOX service のプロファイルサービスでは、単一ユーザーのプロファイルまたは複数ユーザーのプロファイルを要求できます。 したがって、複数ユーザーのプロファイルが必要な場合、ユーザープロファイルごとに一つずつエンドポイントや API を呼び出すのは非常に非効率です。 各呼び出しには多くの認証オーバーヘッドが伴います。 そのため、代わりに情報を取得したいすべてのユーザーを一度に API に渡し、エンドポイントがすべてのユーザープロファイルを同時に処理して単一のレスポンスを返せるようにします。ポーリングの代わりに Real Time Activity (RTA) サービスを使用する
定期的なポーリングの代わりに Real-Time Activity (RTA) サービスを使用することがベストプラクティスです。 Real-Time Activity サービスは、対象のリソースがサービス上で変更されたときにクライアントに通知を送信する Web ソケットを公開します。 RTA サービスは、プレゼンス変更、統計変更、マルチプレイヤーセッションドキュメントの変更、およびソーシャル関係の変更に関する通知を提供します。 クライアントがどの情報に関心を持っているかを知るために、クライアントはまず Web ソケット経由でその項目を購読する必要があります。 これにより、項目が変更されたときに正確に通知されるため、変更を検出するためのサービスへのポーリングを回避できます。 XSAPI は、クライアントが使用できる一連の購読 API として RTA サービスを公開しています。 これらの API にはそれぞれ、項目が変更されたときに呼び出されるコールバック関数を受け取る対応する*ChangedHandler API があります。
- XblPresenceSubscribeToDevicePresenceChange
- XblPresenceSubscribeToTitlePresenceChange
- XblUserStatisticsSubscribeToStatisticChange
- XblSocialSubscribeToSocialRelationshipChange
XSAPI クライアントサイドマネージャーを使用する
XSAPI には、特定のシナリオで面倒な作業をすべて行うキャッシュおよびステートマシンとして機能する一連のマネージャーがあります。Social Manager
Social Manager は、フレンドリストとプロファイルに関する面倒な作業をすべて行います。 Social Manager は、RTA サービスを使用してフレンドリスト、プロファイル、およびプレゼンスデータを最新の状態に保ちます。 Social Manager は、ゲームエンジンに非常に適した同期 API を公開します。 Social Manager はサービスからの最新情報のインメモリキャッシュを保持しているため、ゲームは Social Manager API を頻繁に呼び出せます。 Social Manager を参照してください。Multiplayer Manager
マルチプレイヤーセッション管理には、Multiplayer Manager が従来のマルチプレイヤーゲーム向けのドロップインソリューションとして機能します。 Multiplayer Manager API には、プレイヤーロースターとセッション管理が含まれ、ゲーム招待、途中参加、マッチメイキングを処理し、既存のネットワーキングソリューションに組み込むことができます。 従来のマルチプレイヤーフローの実装に関する面倒な作業をすべて行います。 Multiplayer Manager を参照してください。スロットリング (きめ細かなレート制限)
XBOX services には、単一のデバイスからサービスに極端な負荷をかけないようにするためのスロットリングが用意されています。 タイトルがスロットリングされたときを知ることは重要です。 タイトルがスロットリングされたかどうかを判断するには、次のいずれかの方法を使用します:- HTTP ステータスコード 429 の監視
- デバッグアサートの使用
- XBOX services Trace Analyzer ツールの使用
