API 要求をスロットリングする

完了

API を過剰に使用するユーザーはよく見かけます。 API の過剰な使用により、追加のコストが発生したり、他のユーザーに対する応答が遅れたりすることがあります。 スロットリング (レート制限) を使用して、指定した期間内に API を呼び出すことができる回数を制限することで、API エンドポイントを保護できます。

たとえば、Census API は多くの政府機関に配布されているため、API の呼び出しの数が非常に多くなる可能性があります。 レート制限ポリシーを適用することで、1 つのクライアントで Census API のすべてのリソースを使用することができなくなるため、あらゆる要求に迅速に応答できます。

このユニットでは、API Management ポリシーを使用して 2 種類のスロットリングを行う方法について説明します。

サブスクリプションのスロットリングによる制限

サブスクリプションのスロットリングでは、特定の API 操作によってレート制限を設定できます。 クライアントで区別することはありません。 代わりに、API または指定された操作に対するすべての要求が同じ方法でスロットリングされます。 Census API の例では、サブスクリプション スロットリングを使用して、特定の期間内にいずれかの API が呼び出される回数を制限することができました。 この構成では、その制限に達するとクライアントは 429 エラーを受信することになります。 この種類のスロットリングの問題は、1 つのクライアントがすべての要求を使ってしまい、別のクライアントが要求を使えなくなる可能性があることです。

たとえば、次のコードはすべての API 操作に適用される構成の例を示しています。 この制限は次のように 15 秒間に 3 回の呼び出しに設定されています。

<rate-limit calls="3" renewal-period="15" />

または、特定の API 操作を対象にこの構成を使うこともできます。

<rate-limit calls="number" renewal-period="seconds">
    <api name="API name" id="API id" calls="number" renewal-period="seconds" />
        <operation name="operation name" id="operation id" calls="number" renewal-period="seconds" />
    </api>
</rate-limit>

キーのスロットリングよる制限

キーのスロットリングを使うと、クライアント要求の値によって異なるレート制限を構成できます。 この種のスロットリングでは、指定された要求キー (多くの場合、クライアントの IP アドレス) に制限が適用されるため、レート制限をより適切に管理できるようになります。 すべてのクライアントの API 呼び出しに、等しい帯域幅が割り当てられます。

<rate-limit-by-key calls="number"
                   renewal-period="seconds"
                   increment-condition="condition"
                   counter-key="key value" />

次の構成例は要求の IP アドレスによってレート制限を行います。 ここでは、制限は次のように 60 秒間に 10 回の呼び出しに設定されています。

<rate-limit-by-key calls="10"
              renewal-period="60"
              increment-condition="@(context.Response.StatusCode == 200)"
              counter-key="@(context.Request.IpAddress)"/>

キーによるスロットリングを選択するときは、レート制限に関する特定の要件を決定する必要があります。 たとえば、次の表では、counter-key を指定する 3 つの一般的な方法を示します。

説明
context.Request.IpAddress クライアントの IP アドレスによって制限されるレート
context.Subscription.Id サブスクリプション ID によって制限されるレート
context.Request.Headers.GetValue("My-Custom-Header-Value") 特定のクライアント要求ヘッダー値によって制限されるレート

各クライアント IP ごとに異なる帯域幅を設定できます。その場合は、context.Request.IpAddress を使います。 または、特定のドメインで多数の API 呼び出しが行われる場合は、特定のドメイン名からのすべての要求をスロットリングすることもできます。 その場合は、呼び出しが行われたドメインによってレート制限する context.Request.Headers.GetValue("host") を指定します。

Note

API Management ゲートウェイが従量課金レベル内にある場合は、<rate-limit-by-key> ポリシーは使用できません。 代わりに、<rate-limit> を使用できます。