APIスロットリングを処理する


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/remindersGET /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

レポートを生成する

POST /v1/enterprise/analytics/reports

0.33

10

×

15分ごとに3つのリクエストに制限されます。

認証局管理APIリファレンス

認証局を削除する

DELETE /v1/enterprise/certificateAuthorities/{certificateAuthorityId}

1.0

10

すべての認証局を取得する

GET /v1/enterprise/certificateAuthorities?nextToken={nextToken}&maxResults={maxResults}

1.0

20

すべての認証局を取得する(すべて展開)

GET /v1/enterprise/certificateAuthorities?nextToken={nextToken}&maxResults={maxResults}&expand=all

1.0

10

認証局の詳細を取得する

GET /v1/enterprise/certificateAuthorities/{certificateAuthorityId}

1.0

50

認証局の詳細を取得する(すべて展開)

GET /v1/enterprise/certificateAuthorities/{certificateAuthorityId}?expand=all

1.0

10

コミュニケーション機能API

コミュニケーション機能プロファイルを作成する

POST /v1/communications/profile

1

20

×

すべてのクライアント間でのグローバル制限は20TPSです。

連絡先を作成する

POST /v1/addressBooks/{addressBookId}/contacts

1

10

×

すべてのクライアント間でのグローバル制限は100TPSです。アドレス帳の操作のTPSは、そのアドレス帳に現在関連付けられているユニット数で割った値です。アドレス帳に現在20個のルームが関連付けられているとすると、このアドレス帳で連絡先を追加または削除するときのTPS制限は10/20 = 0.50になります。

相互関連付けを作成する

POST /v1/communications/profile/{profileId}/reciprocalAssociations

1

20

×

グローバル制限は20TPSです。

アドレス帳との関連付けを一括で作成する

POST /v1/addressBooks/{addressBookId}/unitAssociations/batch

100.0

2

アドレス帳との関連付けを一括で作成する

POST /v1/addressBooks/{addressBookId}/unitAssociations/batch

100

2

アドレス帳を作成する

POST /v1/addressBooks

1

40

×

すべてのクライアント間でのグローバル制限は100TPSです。

アドレス帳との関連付けを作成する

POST /v1/addressBooks/{addressBookId}/unitAssociations

1

10

×

ブロックルールを作成する

PUT /v1/communications/profile/{profileId}/contacts/settings/Block?alexaCommunicationProfileId={alexaCommunicationProfileId}

1

5

×

コミュニケーション機能プロファイルを一括で作成する

POST /v1/communications/profiles/batch

100.0

2

連絡先を一括で作成する

POST /v1/addressBooks/{addressBookId}/contacts/batch

100

2

連絡先を一括で作成する

POST /v1/addressBooks/{addressBookId}/contacts/batch

100.0

2

コミュニケーション機能プロファイルを削除する

DELETE /v1/communications/profile/{profileId}

1

20

×

すべてのクライアント間でのグローバル制限は20TPSです。

連絡先を削除する

DELETE /v1/addressBooks/{addressBookId}/contacts/{contactId}

1

10

×

すべてのクライアント間でのグローバル制限は15TPSです。

相互関連付けのステータスを削除する

DELETE /v1/communications/profile/{profileId}/reciprocalAssociations?contactId={contactId}

1

20

×

グローバル制限は20TPSです。

アドレス帳を削除する

DELETE /v1/addressBooks/{addressBookId}

1

40

×

すべてのクライアント間でのグローバル制限は100TPSです。

アドレス帳との関連付けを削除する

DELETE /v1/addressBooks/{addressBookId}/unitAssociations

1

10

×

エンティティIDを使用してコミュニケーション機能プロファイルを取得する

GET /v1/communications/profile?entity.type={entity.type}&entity.id={entity.id}

1

20

×

すべてのクライアント間でのグローバル制限は20TPSです。

profileIdを使用してコミュニケーション機能プロファイルを取得する

GET /v1/communications/profile/{profileId}

1

20

×

すべてのクライアント間でのグローバル制限は20TPSです。

連絡先を取得する

GET /v1/addressBooks/{addressBookId}/contacts/{contactId}

1

30

×

すべてのクライアント間でのグローバル制限は15TPSです。

アドレス帳を取得する

GET /v1/addressBooks/{addressBookId}

1

40

×

すべてのクライアント間でのグローバル制限は100TPSです。

アドレス帳との関連付けを取得する

GET /v1/addressBooks/{addressBookId}/unitAssociations

1

10

×

ブロックルールを取得する

GET /v1/communications/profile/{profileId}/contacts/settings/Block?value={value}

1

5

×

呼びかけ設定を取得する

GET /v1/communications/profile/{sourceProfileId}/contacts/settings/DropIn?alexaCommunicationProfileId={alexaCommunicationProfileId}

1

5

×

相互関連付けのステータスを取得する

GET /v1/communications/profile/{profileId}/reciprocalAssociations?contactId={contactId}

1

20

×

グローバル制限は20TPSです。

ユニットに対するアドレス帳の関連付けのリストを取得する

GET /v1/addressBooks/unitAssociations

1

10

×

アドレス帳のリストを取得する

GET /v1/addressBooks

1

40

×

すべてのクライアント間でのグローバル制限は100TPSです。

連絡先のリストを取得する

GET /v1/addressBooks/{addressBookId}/contacts

1

10

×

すべてのクライアント間でのグローバル制限は15TPSです。

呼びかけ設定を設定する

PUT /v1/communications/profile/{sourceProfileId}/contacts/settings/DropIn?alexaCommunicationProfileId={alexaCommunicationProfileId}

1

5

×

連絡先を更新する

PUT /v1/addressBooks/{addressBookId}/contacts/{contactId}

1

10

×

すべてのクライアント間でのグローバル制限は15TPSです。

アドレス帳を更新する

PUT /v1/addressBooks/{addressBookId}

1

40

×

すべてのクライアント間でのグローバル制限は100TPSです。

エンドポイント機能API

すべてのGET操作

URIが GET /v2/endpoints/{endpointId}/features/で始まるすべての操作(特に記載がない場合)

例:GET /v2/endpoints/{endpointId}/features/bluetooth

1.0

50

×

すべてのPOST操作

URIが POST /v2/endpoints/{endpointId}/features/で始まるすべての操作(特に記載がない場合)

例:POST /v2/endpoints/{endpointId}/features/bluetooth/unpair

1.0

50

×

エンドポイント設定API

addressの設定を取得する

GET /v2/endpoints/{endpointId}/settings/address

1

5

addressを設定する

POST /v2/endpoints/{endpointId}/settings/address

1

5

エンドポイントWi-Fi管理API

Wi-Fiのインストールステータスを取得する

GET /v2/endpoints/{endpointId}/features/connectivity/addOrUpdateWifiConfigurations/submittedOperations/{operationId}

1.0

100

×

Wi-Fi設定を設定する

POST /v2/endpoints/{endpointId}/features/connectivity/addOrUpdateWifiConfigurations

1.0

100

20TPSを超えると、リクエストが完了するまでの時間が長くなります。

エンドポイントAPI

すべてのGET操作

URIが GET /v2/endpointsで始まるすべての操作(特に記載がない場合)

例:GET /v2/endpoints?owner={owner}&expand={expand}&maxResults={maxResults}&nextToken={nextToken}

1.0

100

×

エンドポイントの情報を削除する

POST /v2/endpoints/{endpointId}/forget

1.0

15

×

エンドポイントをID別に取得する

GET /v2/endpoints/{endpointId}?expand={expand}

1.0

50

×

関連付けられているユニットを更新する

PUT /v2/endpoints/{endpointId}/associatedUnits

1.0

15

×

フレンドリー名を更新する

POST /v2/endpoints/{endpointId}/friendlyName

1.0

50

×

イベントメッセンジャーAPI

サブスクリプションを作成する

POST /v1/eventMessenger/subscriptions

1.0

10

×

サブスクリプション設定を作成する

POST /v1/eventMessenger/subscriptionConfigurations

1.0

10

×

サブスクリプション設定を削除する

DELETE /v1/eventMessenger/subscriptionConfigurations/{id}

1.0

10

×

サブスクリプションを削除する

DELETE /v1/eventMessenger/subscriptions/{id}

1.0

10

×

IDでサブスクリプションを取得する

GET /v1/eventMessenger/subscriptions/{id}

1.0

30

×

IDでサブスクリプション設定を取得する

GET /v1/eventMessenger/subscriptionConfigurations/{id}

1.0

30

×

サブスクリプション設定を取得する

GET /v1/eventMessenger/subscriptionConfigurations

1.0

30

×

サブスクリプションを取得する

GET /v1/eventMessenger/subscriptions

1.0

30

×

通知API

通知を送信する

POST /v3/notifications

100.0

3

×

ユニット数が減少すると、TPSが増加します。1秒あたり300ユニット向けに通知を作成できます。

プロアクティブサジェスチョンAPI

キャンペーンを作成する

POST /v1/proactive/campaigns

100.0

3

×

ユニット数が減少すると、TPSが増加します。1秒あたり300ユニット向けに通知を作成できます。

施設階層管理API

ユニットを作成する

POST /v2/units

1.0

30

リマインダーAPI

リマインダーの作成

POST /v2/alerts/reminders

1.0

10

すべてのリマインダーAPIには1つの共有TPSプールがあり、合計は50TPSです。

リマインダーの削除

DELETE /v2/alerts/reminders/{reminderId}

1.0

10

すべてのリマインダーAPIには1つの共有TPSプールがあり、合計は50TPSです。

リマインダーの取得

GET /v2/alerts/reminders/{reminderId}

1.0

10

すべてのリマインダーAPIには1つの共有TPSプールがあり、合計は50TPSです。

リマインダーの更新

PUT /v2/alerts/reminders/{reminderId}

1.0

10

すべてのリマインダーAPIには1つの共有TPSプールがあり、合計は50TPSです。

スキル管理API

複数のユニットでスキルを有効にする

POST /v1/skills/{skillId}/enablements/batch

100

2

×


このページは役に立ちましたか?

最終更新日: 2025 年 06 月 16 日