> ## Documentation Index
> Fetch the complete documentation index at: https://docs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# きめ細かなレート制限

> XBOX services のきめ細かなレート制限 (FGRL) の概要。バースト制限と持続制限、HTTP 429 応答、および XSTA を使用したスロットリングの検出方法を扱います。

この記事では、XBOX services のきめ細かなレート制限 (FGRL) の概要を説明します。
レート制限とは何かをまとめるだけでなく、この文書は、あなたが制限されているかどうかを判断する方法、および制限されている場合に利用できるツールとリソースを支援することを目的としています。

**きめ細かなレート制限 (Fine-Grained Rate Limiting)** は、異なるタイトル間で共有される XBOX リソースの **公正な使用** を促進するために設計されました。
このソリューションは、あるエンティティが一定期間に行ったリクエスト数のカウントを保持するサービスを持つ、ほとんどの伝統的な制限システムに似ています。

サービスに指定された制限に達したエンティティは拒否状態に移され、そのエンティティからのすべての受信リクエストが拒否されます。
エンティティは、指定された期間が満了しエンティティに関連付けられたカウントがリセットされたときにのみ、この状態を抜けられます。

きめ細かなレート制限は、上記と同じコアメカニクスを使用しますが、1 つのエンティティを追跡する代わりに、FGRL は **ユーザーとタイトル** の組み合わせを追跡し、関連付けられたカウントを 1 つではなく **2 つ** の異なる **制限** と比較します。
FGRL の 2 つの制限は各サービスで適用され、つまり GameClips のリクエスト数は Presence のリクエスト数に影響しません。

以下のセクションでは、ユーザーとタイトルのペアリング、二重制限、および HTTP 429 制限応答オブジェクトについて詳しく説明します。

## きめ細かなレート制限の用語

| 用語 | 定義 |
| - | - |
| FGRL | Fine-Grained Rate Limiting (きめ細かなレート制限) |
| XSAPI | XBOX Services Application Program Interface |
| CU | コンテンツアップデート |
| Burst | 短期間に受信したリクエスト量を表す |
| Sustain | 一定期間にわたって継続的に受信する大量の呼び出しを表す |
| User + Title | ユーザーとタイトルを 1 つのエンティティとしてペアにしたもの |
| XSTA | XBOX services Trace Analyzer ツール。タイトルがレート制限されているかどうかを判断するために使用 |

## 公正な使用

XBOX は、ユーザーがプレイしているゲーム (またはアプリ) に関係なく、すべてのユーザーが同じ高品質のエクスペリエンスを持つべきだと考えています。
きめ細かなレート制限 (FGRL) は次のシナリオを解決します:

開発者 A が、サービスの最適な使用を保証するすべての XBOX services ベストプラクティスに従ったタイトルをリリースしたばかりです。一方、開発者 B もタイトルをリリースしましたが、こちらには未知のバグがあります。
このバグにより、タイトルと各ユーザーがプレゼンスをスパムし、その結果サービスが高負荷になります。
サービスは遅くなり、最終的に停止し、開発者 A のユーザーのエクスペリエンスを損なうことになりますが、原因は開発者 B のバグでした。

FGRL が実装されていれば、サービスは行儀の悪いタイトルからのリクエストの受信を停止し、開発者 A のタイトルにリソースの公正な取り分を提供できていたはずです。

## タイトルとユーザーの粒度

XBOX リソースの公正な使用を保証するために、タイトルとユーザーがキーとして選ばれました。

ユーザーのみを追跡すると、ユーザーエクスペリエンスが各タイトルの統合次第になるシナリオが生まれます。
例えば、ほとんどのタイトルはすでに people サービスを使用しているので、この例のために、people サービス上できめ細かなレート制限が設定され、5 分間に 100 リクエスト以下に制限されていると仮定します。

ユーザーが 1 分間に 100 リクエストを送るゲームをプレイした場合、制限を超えてしまい、people サービスへのそれ以上のリクエストが送信できなくなります。同じ期間内にそのユーザーがホーム画面に戻ってフレンドリストをクリックしたと想像してください。ユーザーはすでに制限を超えているので、ホーム画面がユーザーを制限状態にしたわけではないにもかかわらず、5 分間の間隔が経過するまでそのフレンドリストの呼び出しは失敗します。

一方、タイトルのみに基づいて制限すると、同様に不公平な結果が生まれます。
タイトルごとに制限を設定すると、タイトルの人気度が無視され、制限に達するまでリクエストは先着順で処理されるだけです。

ユーザーとタイトルのペアリングは、アクティブなユーザー数を考慮してタイトルが適切以上のリソースを使わないことを保証し、同時に各ユーザーに一貫したリソースの取り分を与えます。

![Rate limiting request and response flowchart](https://mintcdn.com/microsoft-4404708b/gzrdvT5kpqAXKEQt/images/gdk/services/FGRL.png?fit=max\&auto=format\&n=gzrdvT5kpqAXKEQt\&q=85\&s=239325bee1cba0140da0f07b0e0d4a54)

上の図は、リクエストがどのように処理されるかの高レベルビューを示しています。
まずリクエストが生成され、目的のサービスによって受信されます。
リクエストを受け取ると、システムはユーザーとタイトルが合計で何回サービスにアクセスしたかを確認します:

* リクエストが制限を下回っている場合、通常通り処理されます。
* リクエストが制限以上であるとわかった場合、サービスはそれをドロップし、代わりに 429 応答を返します。

応答は、期間がロールオーバーしてユーザーとタイトルのリクエストが処理可能になるまでの時間を示します。

## バースト制限と持続制限

伝統的に、レート制限はエンドポイントごとに 1 つの制限で構成され、それが一定期間にわたって追跡されます。
この期間は、エンティティのリクエスト数が追跡される時間の長さを表します。
期間の終わりにエンティティのカウントは 0 にリセットされ、再び追跡が始まります。

このアプローチはほとんどの API で機能しますが、XBOX services を呼び出すゲームやアプリには十分な回復力がありませんでした。
上記のソリューションは、人々が一貫した安定した予測可能な方法で呼び出しを行うと仮定しています。
XBOX services の場合、サービスと要求元のタイトルによって、呼び出しパターンは劇的に異なります。

この場合に 1 つの制限だけを選択すると、呼び出しパターンのスペクトルの両端で妥協する必要があります。
XBOX services のソリューションは 2 つの期間と制限を使用します。
小さい方の期間はバースト期間と呼ばれ、大きくて長い方は持続 (サステイン) 期間と呼ばれます。

FGRL のバースト期間は常に 15 秒で、持続期間は常に 300 秒 (5 分) です。
したがって、5 分の持続期間内には 20 のバースト期間があります。

バースト制限と持続制限は同時に追跡され、そのため同時にリクエストをカウントします。
バースト制限と持続制限はどちらもサービス上に設定されており、各サービスには独自のバーストと持続のカウントがあります。

これら 2 つの制限がどのように連携するかを理解しやすくするために、下の表は、FGRL を実装したサービスに対して多数のリクエストを行うタイトルをプレイしているユーザーを示しています。
この場合、バースト制限は 15 秒で 30 リクエスト、持続制限は 5 分で 100 リクエストです。

| 期間 (秒) | バースト期間ごとのリクエスト | 持続期間ごとのリクエスト | 15 秒間隔内でスロットリングされたリクエスト数 | どちらの制限？ (バースト、持続、または両方) |
| - | - | - | - | - |
| 0-15 | 35 | 35 | 5 | バースト |
| 15-30 | 28 | 63 | 0 | N/A |
| 30-45 | 21 | 84 | 0 | N/A |
| 45-60 | 36 | 120 | 20 | 両方 |
| 60-75 | 24 | 144 | 24 | 持続 |
| … | … | … | | … |
| 285-300 | 4 | 148 | | 持続 |

表は、最初の 15 秒でユーザーが 35 リクエストを行いバースト制限に達したことを示しています。
それらの余分な 5 リクエストはドロップされ、5 つの 429 応答が送信されます。

スロットリングされたにもかかわらず、それらの 5 リクエストは依然として持続制限にカウントされます。
いずれかの制限に達すると、リクエストは通されません。これは 45 秒時点で両方の制限に達した時と、285 秒時点で 4 リクエストしか行われなかった時に示されています。

## HTTP 429 応答オブジェクト

関連付けられたユーザーとタイトルのカウントがバーストまたは持続の制限以上になると、サービスはリクエストを処理せず、代わりに HTTP 429 応答を返します。XSAPI を使用する場合、これは 0x801901AD の HRESULT に相当します。
HTTP 429 コードは "too many requests" (リクエストが多すぎる) を意味し、"retry after X seconds" (X 秒後に再試行) の値を含むヘッダーを伴います。

FGRL の 429 応答オブジェクトには "retry after" ヘッダーが含まれており、これは呼び出し側エンティティが再試行するまでに待機すべき時間を指定します。
XSAPI を使用する開発者は心配する必要はありません。XSAPI は Retry-After ヘッダーを尊重し処理します。

実際の応答には次のフィールドが含まれます:

| フィールド名 | 値の型 | 例 | 定義 |
| - | - | - | - |
| Version | Integer | `"version":1` | |
| currentRequests | Integer | `"currentRequests":13` | 送信されたリクエストの総数 |
| maxRequests | Integer | `"maxRequests":10` | 許可されるリクエストの総数 |
| periodInSeconds | Integer | `"periodInSeconds":15` | 時間ウィンドウ |
| Type | String | `"type":"burst"` | スロットリング制限の種類 |

## 実装済みの制限

次のサービスは FGRL 制限を実装しており、これらの制限は **2016 年 5 月** から適用されています。
これらの制限はすべてのサンドボックスおよびタイトルで同じです。

**2016 年 5 月より前に XBOX Developer Platform または Partner Center 経由で公開および出荷されたタイトルはレガシーとみなされ、免除されます。**

| **名前** | **バースト制限** (ユーザーごとタイトルごと 15 秒) | **持続制限** (ユーザーごとタイトルごと 300 秒) | **認定制限** (持続の 10 倍、ユーザーごとタイトルごと 300 秒) |
| - | - | - | - |
| Stats Read | 100 | 300 | 3000 |
| Profile | 10 | 30 | 300 |
| MPSD | 30 | 300 | 3000 |
| Search Handle (MPSD) | Read 1, Write 1 | Read 20, Write 20 | Read 20, Write 20 |
| MPA Recent Players | 3 | 50 | 50 |
| MPA Invites | 7 | 50 | 50 |
| MPA Activity | Create/Delete 10, Read/Query 20 | Create/Delete 100, Read/Query 200 | Create/Delete 100, Read/Query 200 |
| Presence | Read 10, Write 3 | Read 100, Write 30 | Read 1000, Write 300 |
| Social | 10 | 30 | 300 |
| Leaderboards | 30 | 100 | 1000 |
| Achievements | 100 | 300 | 3000 |
| Smart Match | 10 | 100 | 1000 |
| User Posts | 100 | 300 | 3000 |
| Stats Write | 100 | 300 | 3000 |
| Privacy | 10 | 30 | 300 |
| Clubs | 10 | 30 | 300 |
| Authentication (S2S only) | 15 | 50 | 500 |

上の表は、FGRL のために選択された現在のサービスのリストを表しています。
このリストは最終的なものではなく、新しいサービスや既存のサービスが追加される可能性があります。
サービスが追加される際には、この表が更新され、アナウンスが行われます。

表内の制限は変更される可能性があります。
サービスが変化し進化するに伴い、制限も変化しますが、通知が行われ、必要なレガシー免除が適用されます。

## サービスマッピングとレート制限のタイトルへの影響

| **名前** | **サービスエンドポイント** | **FGRL による予想されるゲームへの影響** |
| - | :-: | - |
| Stats Read | userstats.xboxlive.com | Achievements や Leaderboards のエントリーが更新または取得されない。 |
| Profile | profile.xboxlive.com | プレイヤーのデータが更新または正しく表示されない。 |
| MPSD | sessiondirectory.xboxlive.com | 参加/招待が正しく完了せず、セッションが適切に作成または更新されず、タイトルの失敗の原因となる可能性がある。 |
| MPA | multiplayeractivity.xboxlive.com | 参加/招待が正しく完了せず、最近のプレイヤー情報が正しく機能しない。 |
| Presence | presence.xboxlive.com | プレイヤーのゲーム内プレゼンスが正確でない。 |
| Social | social.xboxlive.com | すべてのフレンドの書き込み (例: フレンド追加、お気に入り登録など) に影響し、フレンドの読み取り (例: 自分のフレンドリストの取得) に影響する可能性がある。開発者には social.xboxlive.com ではなく peoplehub を読み取りに使用することが推奨されている。 |
| Leaderboards | leaderboards.xboxlive.com | リーダーボードのゲーム内 UX が反映/更新されない。 |
| Achievements | achievements.xboxlive.com | アンロックした実績のゲーム内 UX が更新されない。 |
| Smart Match | momatch.xboxlive.com | マッチが正常に設定されない。 |
| User Posts | userposts.xboxlive.com | ユーザー投稿が表示されない。 |
| Stats Write | statswrite.xboxlive.com | Achievements や Leaderboards のエントリーが更新されない。 |
| Privacy | privacy.xboxlive.com | プライバシー失敗により、すべての呼び出し元に対してアクセスがブロックされる可能性がある。 |
| Clubs | Clubhub.xboxlive.com | プレイヤーがゲーム内のクラブを見られなくなる可能性がある。 |
| Authentication (S2S only) | title.mgt.xboxlive.com | サービス間の呼び出し認証が失敗する。 |

**注:** 最新の API マッピングは定期的に更新されており、[Live Trace Analyzer API Mapping](https://github.com/Microsoft/xbox-live-trace-analyzer/blob/master/Source/XboxLiveTraceAnalyzer.APIMap.csv) にあります。

## FAQ

### スロットリングされているかどうかを判断する方法と、講じることのできる手順は？

呼び出しパターンを改善するための手順、および XSAPI のアサーションや XSAPI Social/Multiplayer マネージャーがスロットリング問題を通知し、それらの問題を軽減するためにどのように使用できるかの説明が含まれる、[XBOX services 呼び出しのベストプラクティス](https://docs.xbox.com/ja-jp/services/xbox-services/develop/best-practices/live-best-practices-calling-xbl.md) を参照してください。

もう 1 つの選択肢は、XBOX サービス呼び出しのトレースを記録し、[XBOX services Trace Analyzer ツール](https://learn.microsoft.com/windows/uwp/xbox-live/tools/analyze-service-calls) を使用してそのトレースを分析することです。
トレースを記録するには、Fiddler を使用して .SAZ ファイルを記録するか、XSAPI の組み込みトレースログを使用します。

XSAPI でトレースをオンにして使用するには、[サービス呼び出しをレビューするための Trace Analyzer](https://docs.xbox.com/ja-jp/tools/tools-services/live-trace-analyzer.md) を参照してください。
トレースを取得すると、XBOX services Trace Analyzer ツールはスロットリングされた呼び出しを検出した際に警告を発します。

### 制限は変わりますか？

公開されている制限は時間とともに変わらないことを意図しています。
ただし、必要が生じた場合、一部の制限がより厳格になる可能性があります。その場合、すでに RETAIL にリリースされているタイトルは更新された制限から免除されます。

### さらに多くのサービスに制限が適用されますか？

はい、さらに多くのサービスと新しいサービスに制限が作成される可能性があり、そうなります。
ただし、この最初の FGRL リリースと同様に通知が行われ、適切な予防策が講じられます。

### これらの変更はいつ有効になりますか？

レート制限は **2016 年 5 月** から施行されています。
**2018 年 4 月** の時点で、指定された持続制限を 10 倍以上超えるタイトルは XBOX 認定プロセスを通過できません。

### 制限を守れない場合はどうすればよいですか？

[XBOX services 呼び出しのベストプラクティス](https://docs.xbox.com/ja-jp/services/xbox-services/develop/best-practices/live-best-practices-calling-xbl.md) を参照し、これらの手順に従っていることを確認してください。
いずれかのソーシャルサービスでレート制限されている場合、[Social Manager](https://docs.xbox.com/ja-jp/services/xbox-services/community/social-manager/live-social-manager-nav.md) の使用も検討してください。

これらの手順に従っても制限内に留まれない場合は、Developer Account Manager にお問い合わせください。

**注: 指定された制限以上のタイトルは、2018 年 4 月以降、認定を通過できなくなります。**
例えば、上の表で持続制限が 300 秒あたり 300 コールに設定されている場合、300 秒あたり 3000 コール以上のタイトルは認定に失敗します。
テストケースを含む詳細情報については、[XR-132 Service Access Limitations](https://aka.ms/xrs) を参照してください。

### 既存のタイトルはどうなりますか？

2018 年 4 月より前に RETAIL 状態にあったタイトルはレガシーとみなされ、免除されます。

### コンテンツアップデートは？

レガシーまたは免除されたタイトルの場合、コンテンツアップデートも免除されますが、ゲームのサービス統合の側面を最適化するためにツールとアセットを活用することを強くお勧めします。

### コンテンツアップデートを行えるようになるまで、ゲームの免除を受けることはできますか？

Developer Account Manager にご相談ください。


## Related topics

- [XStoreQueryProductsAsync](https://docs.xbox.com/ja-jp/reference/system/xstore/functions/xstorequeryproductsasync.md)
- [ベスト プラクティス](https://docs.xbox.com/ja-jp/services/xbox-services/develop/best-practices/index.md)
- [XStoreQueryEntitledProductsAsync](https://docs.xbox.com/ja-jp/reference/system/xstore/functions/xstorequeryentitledproductsasync.md)
- [XStoreQueryAssociatedProductsAsync](https://docs.xbox.com/ja-jp/reference/system/xstore/functions/xstorequeryassociatedproductsasync.md)
- [XBOX services 呼び出しのベストプラクティス](https://docs.xbox.com/ja-jp/services/xbox-services/develop/best-practices/live-best-practices-calling-xbl.md)
