依訂用帳戶限制呼叫率

適用於:所有 APIM 層

rate-limit 原則藉由將指定時間週期內的呼叫頻率限制為指定次數,以防止每個訂用帳戶的 API 使用量暴增。 達到速率限制時,呼叫端會收到 429 Too Many Requests 回應狀態碼。

若要瞭解速率限制和配額之間的差異,請參閱速率限制和配額。

警告

由於節流架構的分散式本質,速率限制永遠不會完全準確。 所設定的允許要求數目與實際數目之間的差異,會因要求量和速率、後端延遲及其他因素而有所不同。

注意

請依照原則陳述式中提供的順序,來設定原則的元素和子元素。 深入了解如何設定或編輯 APIM 原則。

原則陳述式

<rate-limit calls="number" renewal-period="seconds"  retry-after-header-name="custom header name, replaces default 'Retry-After'" 
        retry-after-variable-name="policy expression variable name"
        remaining-calls-header-name="header name"  
        remaining-calls-variable-name="policy expression variable name"
        total-calls-header-name="header name">
    <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>

屬性

屬性 描述 是必要欄位 預設
通話 在 renewal-period 中指定的時間週期內允許的呼叫總數上限。 不允許使用原則運算式。 是的 N/A
續約期間 滑動視窗的長度,其中允許的要求數目不應超過 calls 中指定的值。 允許的最大值:300 秒。 不允許使用原則運算式。 是的 N/A
retry-after-header-name 自訂回應標頭的名稱,其值是超過指定呼叫率之後,以秒為單位的建議重試間隔。 不允許使用原則運算式。 否 Retry-After
retry-after-variable-name 超過指定呼叫率之後,以秒為單位儲存建議重試間隔的變數名稱。 不允許使用原則運算式。 否 N/A
remaining-calls-header-name 回應標頭的名稱,每個原則執行之後的值都是對於在 renewal-period 中指定的時間間隔允許的剩餘呼叫次數。 不允許使用原則運算式。 否 N/A
remaining-calls-variable-name 變數的名稱,每個原則執行之後的變數都是對於在 renewal-period 中指定的時間間隔允許的剩餘呼叫次數。 不允許使用原則運算式。 否 N/A
total-calls-header-name 回應標頭的名稱,其值為 中指定的 calls 值。 不允許使用原則運算式。 否 N/A

元素

元素 描述 是必要欄位
API(應用程式介面) 新增一個或多個這些元素,以對產品內的 API 強加呼叫頻率限制。 產品和 API 呼叫頻率限制會獨立套用。 API 可以透過 name 或 id 參考。 如果同時提供兩個屬性,則會使用 id 而忽略 name。 否
作業 新增一個或多個這些元素,以對 API 內的作業強加呼叫頻率限制。 產品、API 和作業呼叫頻率限制會獨立套用。 作業可以透過 name 或 id 參考。 如果同時提供兩個屬性,則會使用 id 而忽略 name。 否

API 屬性

屬性 描述 是必要欄位 預設
NAME 要套用速率限制的 API 名稱。 必須指定 name 或 id 其中之一。 N/A
識別碼 要套用速率限制的 API 識別碼。 必須指定 name 或 id 其中之一。 N/A
通話 在 renewal-period 中指定的時間週期內允許的呼叫總數上限。 不允許使用原則運算式。 是的 N/A
續約期間 滑動視窗的長度,其中允許的要求數目不應超過 calls 中指定的值。 允許的最大值:300 秒。 不允許使用原則運算式。 是的 N/A

操作屬性

屬性 描述 是必要欄位 預設
NAME 要套用速率限制的作業名稱。 必須指定 name 或 id 其中之一。 N/A
識別碼 要套用速率限制的作業識別碼。 必須指定 name 或 id 其中之一。 N/A
通話 在 renewal-period 中指定的時間週期內允許的呼叫總數上限。 不允許使用原則運算式。 是的 N/A
續約期間 滑動視窗的長度,其中允許的要求數目不應超過 calls 中指定的值。 允許的最大值:300 秒。 不允許使用原則運算式。 是的 N/A

Important

當使用 name or id 屬性引用 API 或操作時,連結存取不會被檢查。 擁有撰寫政策權限的使用者可以參考任何可用的 API 或操作,並讓 API Management 根據設定的速率限制計算並限制該訂閱流量,即使使用者沒有該資源的讀取權限。 這並不授權你查看或修改 API 或操作定義。

使用方式

使用注意事項

  • 每份原則定義只能使用此原則一次。
  • 只有在使用訂用帳戶金鑰存取 API 時,才會套用此原則。
  • v2 層級使用 代幣桶演算法 來限制速率,這與經典層級的 滑動視窗演算法 不同。 基於此實作差異,當你在多個範圍內 counter-key設定 v2 層級的 token 限制時,請確保 tokens-per-minute 所有政策實例的值一致。 數值不一致會導致行為變得不可預測。 更多資訊請參見 Advanced request throttling with Azure API 管理
  • 自我裝載閘道中的速率限制計數可以設定為在本機同步處理 (在叢集節點之間的閘道執行個體之間),例如,透過適用於 Kubernetes 的 Helm 圖表部署或使用 Azure 入口網站部署範本。 不過,頻率限制計數不會與 APIM 執行個體中設定的其他閘道資源 (包括雲端中的受控閘道) 同步。 深入了解
  • 此原則會追蹤每個套用閘道的呼叫,包括多區域部署中的工作區閘道和區域閘道。 它不會匯總整個實例的呼叫數據。

範例

在下列範例中,每個訂閱的速率限制是每 90 秒 20 次呼叫。 在每個原則執行之後,時間週期中允許的其餘呼叫會儲存在變數 remainingCallsPerSubscription 中。

<policies>
    <inbound>
        <base />
        <rate-limit calls="20" renewal-period="90" remaining-calls-variable-name="remainingCallsPerSubscription"/>
    </inbound>
    <outbound>
        <base />
    </outbound>
</policies>

如需使用原則的詳細資訊,請參閱: