對 API 要求進行節流
通常會發現一些使用者過度使用 API。 有時候,API 過度使用到這種程度,使您產生額外的成本,或降低對其他使用者的回應能力。 您可以使用節流 (速率限制) 來協助保護 API 端點,方法是限制在指定的期間內可呼叫 API 的次數。
例如,Census API 會散發到許多政府機關,因此對 API 的呼叫數可能會變得很重要。 藉由套用速率限制原則,我們可以對所有要求啟用快速回應,因此單一用戶端無法使用 Census API 的所有資源。
在此單元中,您將了解如何使用 API 管理原則來強加兩種類型的節流。
透過訂用帳戶節流限制
訂用帳戶節流可讓您依據特定的 API 作業設定速率限制。 它不會依用戶端區分。 相反地,對 API 或指定作業的每個要求都會以相同方式進行節流。 使用我們的人口普查 API 範例,我們可以使用訂用帳戶節流來限制在特定期間內呼叫任何 API 的次數。 此設定會導致用戶端在達到該限制時,收到 429 錯誤。 這種節流類型的問題在於,它可讓一個用戶端在其他用戶端可以使用所有要求之前,最多先使用這些要求。
例如,下列程式碼會示範適用於所有 API 作業的範例設定。 限制會設定為每 15 秒三次呼叫:
<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 的常見方式:
值 | Description |
---|---|
context.Request.IpAddress | 依用戶端 IP 位址限制的速率 |
context.Subscription.Id | 依訂用帳戶識別碼限制的速率 |
context.Request.Headers.GetValue("My-Custom-Header-Value") | 依所指定用戶端要求標頭值限制的速率 |
您可能決定要讓每個個別用戶端 IP 都擁有自己的頻寬設定,在此情況下,您會使用 context.Request.IpAddress。 或者,您可能想要對來自特定網域名稱的所有要求進行節流,因為某些網域具有許多對 API 的呼叫。 在此情況下,您會指定 context.Request.Headers.GetValue("host"),這將依據發出呼叫的網域進行速率限制。
注意
當您的 API 管理閘道位在使用量層時,無法使用 <rate-limit-by-key>
原則。 您可以改用 <rate-limit>
。