APIスロットリングを処理する
Alexa Smart Properties(ASP)REST APIでは、処理できる1秒あたりのトランザクション数(TPS)、つまりリクエスト数が制限されます。コードではこの点を考慮し、HTTP 429 Request Throttled
応答を適切に処理する必要があります。
コードでAPIスロットリングを処理する方法
APIへのリクエストがそのAPIのTPS制限を超えると、APIはHTTP 429 Request Throttled
応答を返します。制限された応答はAPIの有効な状態であり、エラーと見なすべきではありません。
Amazonでは、防御的にコーディングを行い、制限された応答を適切に処理することを推奨しています。429
応答を処理してAPI呼び出しを再試行するコードは、特定のAPIの特定のTPS制限に依存しないようにする必要があります。適切なコードであれば、TPS制限を無視して、すべてのASP APIで同じアルゴリズムを使用できます。
たとえば、429を返すリクエストを次のように管理します。
- try/catch構造を使用してリクエストを再試行し、エラーを捕捉します。ほかのエラーは、通知を使用するか、アップストリームに例外をスローするなどして適切に処理します。
- 応答コードが呼び出しの成功(通常は200または202)を示している場合は、その応答を通常どおり使用します。
- 応答コードが429の場合は、スリープ期間待ってから再試行し、再試行回数を1回ずつ増やします。
- 再試行するたびにスリープ期間を2倍に増やします。
- 最大再試行回数を設定し、この最大再試行回数を超えたら再試行を停止します。
429応答を処理するサンプルコード
次のコード例は、再試行コードを実装するリクエストマネージャー関数(getAPIResponse
)を示しています。
import axios from 'axios';
export const apiSettings =
{
apiDelay : 1000,
baseURL : 'https://api.amazonalexa.com',
backoff: "2000,3000,5000,8000,13000,21000"
}
function apiCallDelay(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
let backoff;
// configはaxiosのconfigオブジェクトです。
export async function getAPIResponse(config, backoffIndex) {
if (backoffIndex === undefined && apiSettings.backoff.length > 0) {
backoff = apiSettings.backoff.split(',');
backoffIndex = 0;
}
let res = null;
try {
res = await axios(config);
await apiCallDelay(apiSettings.apiDelay);
if (res.data) {
return res.data;
}
return{statuscode: res.status};
} catch (err) {
if (err.response?.status)
{
// 429 TOO_MANY_REQUESTS
if ([503,500,429].includes(err.response.status)) {
if (backoffIndex < backoff.length) {
await apiCallDelay(backoff[backoffIndex]);
return getAPIResponse(config, backoffIndex + 1);
}
}
res = err.response.data;
res.statuscode = err.response.status;
} else if (err.response && (typeof err.response.data) === 'string') {
// APIからJSONデータが返されません。
res = { statuscode : err.response.status};
}
else
{
res = { code : err.code};
}
return res;
}
}
ASP REST APIのTPS制限値
このセクションの表は、ASP REST APIのTPS制限をまとめたものです。これらの詳細は、期待されるAPIの動作を想定するために役立てることができます。ただし、既に説明したように、特定の制限に依存したり、特定の制限をコードで参照したりしないでください。
この表では、次の概念が使用されています。
- 共有TPS - そのAPI操作を同時に呼び出すすべてのユーザー間で共有される、1秒あたりのトランザクション数。たとえば、APIの共有TPSが10であるとします。あるユーザーが5TPSでAPIを呼び出した場合、ほかのユーザーが使用できるのは5TPSだけになります。
-
操作間での共有 - 一部のAPIは、個々の操作ではなく、一連のAPI操作全体でTPSを共有します。たとえば、リマインダーのTPS制限は、
POST /v2/alerts/reminders
、GET /v2/alerts/reminders/{reminderId}
、PUT /v2/alerts/reminders/{reminderId}
、DELETE /v2/alerts/reminders/{reminderId}
の合計に対して適用されます。API操作がほかの操作とTPSを共有するかどうかは、備考列に示されています。
-
設定に依存する制限 - 一部のAPIには、APIのパラメーターやプロパティの設定に依存するTPS制限があります。たとえば、アドレス帳の連絡先を作成または削除する
/v1/addressBooks/{addressBookId}/contact
呼び出しの場合、TPS制限は、アドレス帳に関連付けられているユニットの数で割った値になります。アドレス帳に20個のルームが関連付けられているとすると、このアドレス帳で連絡先を追加または削除するときのTPS制限は10/20 = 0.50になります。特定のAPI操作のTPSが設定に応じて変更される場合の詳細は、備考列に記載されています。
API操作 | APIリクエストあたりのユニット数 | NAでのTPS制限 | 共有TPS | 備考 |
---|---|---|---|---|
分析API | ||||
|
0.33 |
10 |
× |
15分ごとに3つのリクエストに制限されます。 |
|
1.0 |
10 |
◯ | |
|
1.0 |
20 |
◯ | |
|
1.0 |
10 |
◯ | |
|
1.0 |
50 |
◯ | |
|
1.0 |
10 |
◯ | |
コミュニケーション機能API | ||||
|
1 |
20 |
× |
すべてのクライアント間でのグローバル制限は20TPSです。 |
|
1 |
10 |
× |
すべてのクライアント間でのグローバル制限は100TPSです。アドレス帳の操作のTPSは、そのアドレス帳に現在関連付けられているユニット数で割った値です。アドレス帳に現在20個のルームが関連付けられているとすると、このアドレス帳で連絡先を追加または削除するときのTPS制限は10/20 = 0.50になります。 |
|
1 |
20 |
× |
グローバル制限は20TPSです。 |
|
100.0 |
2 |
◯ | |
|
100 |
2 |
◯ | |
|
1 |
40 |
× |
すべてのクライアント間でのグローバル制限は100TPSです。 |
|
1 |
10 |
× | |
|
1 |
5 |
× | |
|
100.0 |
2 |
◯ | |
|
100 |
2 |
◯ | |
|
100.0 |
2 |
◯ | |
|
1 |
20 |
× |
すべてのクライアント間でのグローバル制限は20TPSです。 |
|
1 |
10 |
× |
すべてのクライアント間でのグローバル制限は15TPSです。 |
|
1 |
20 |
× |
グローバル制限は20TPSです。 |
|
1 |
40 |
× |
すべてのクライアント間でのグローバル制限は100TPSです。 |
|
1 |
10 |
× | |
エンティティIDを使用してコミュニケーション機能プロファイルを取得する
|
1 |
20 |
× |
すべてのクライアント間でのグローバル制限は20TPSです。 |
profileIdを使用してコミュニケーション機能プロファイルを取得する
|
1 |
20 |
× |
すべてのクライアント間でのグローバル制限は20TPSです。 |
|
1 |
30 |
× |
すべてのクライアント間でのグローバル制限は15TPSです。 |
|
1 |
40 |
× |
すべてのクライアント間でのグローバル制限は100TPSです。 |
|
1 |
10 |
× | |
|
1 |
5 |
× | |
|
1 |
5 |
× | |
|
1 |
20 |
× |
グローバル制限は20TPSです。 |
|
1 |
10 |
× | |
|
1 |
40 |
× |
すべてのクライアント間でのグローバル制限は100TPSです。 |
|
1 |
10 |
× |
すべてのクライアント間でのグローバル制限は15TPSです。 |
|
1 |
5 |
× | |
|
1 |
10 |
× |
すべてのクライアント間でのグローバル制限は15TPSです。 |
|
1 |
40 |
× |
すべてのクライアント間でのグローバル制限は100TPSです。 |
エンドポイント機能API | ||||
URIが |
1.0 |
50 |
× | |
URIが |
1.0 |
50 |
× | |
エンドポイント設定API | ||||
|
1 |
5 |
◯ | |
|
1 |
5 |
◯ | |
エンドポイントWi-Fi管理API | ||||
|
1.0 |
100 |
× | |
|
1.0 |
100 |
◯ |
20TPSを超えると、リクエストが完了するまでの時間が長くなります。 |
エンドポイントAPI | ||||
URIが |
1.0 |
100 |
× | |
|
1.0 |
15 |
× | |
|
1.0 |
50 |
× | |
|
1.0 |
15 |
× | |
|
1.0 |
50 |
× | |
イベントメッセンジャーAPI | ||||
|
1.0 |
10 |
× | |
|
1.0 |
10 |
× | |
|
1.0 |
10 |
× | |
|
1.0 |
10 |
× | |
|
1.0 |
30 |
× | |
|
1.0 |
30 |
× | |
|
1.0 |
30 |
× | |
|
1.0 |
30 |
× | |
通知API | ||||
|
100.0 |
3 |
× |
ユニット数が減少すると、TPSが増加します。1秒あたり300ユニット向けに通知を作成できます。 |
プロアクティブサジェスチョンAPI | ||||
|
100.0 |
3 |
× |
ユニット数が減少すると、TPSが増加します。1秒あたり300ユニット向けに通知を作成できます。 |
施設階層管理API | ||||
|
1.0 |
30 |
◯ | |
リマインダーAPI | ||||
|
1.0 |
10 |
◯ |
すべてのリマインダーAPIには1つの共有TPSプールがあり、合計は50TPSです。 |
|
1.0 |
10 |
◯ |
すべてのリマインダーAPIには1つの共有TPSプールがあり、合計は50TPSです。 |
|
1.0 |
10 |
◯ |
すべてのリマインダーAPIには1つの共有TPSプールがあり、合計は50TPSです。 |
|
1.0 |
10 |
◯ |
すべてのリマインダーAPIには1つの共有TPSプールがあり、合計は50TPSです。 |
スキル管理API | ||||
|
100 |
2 |
× |
関連トピック
最終更新日: 2025 年 06 月 16 日