配額政策

您目前查看的是 Apigee Edge 說明文件。
前往 Apigee X 說明文件
info

結果

使用配額政策設定 API Proxy 在一段時間內 (例如一分鐘、一小時、一天、一週或一個月) 允許的要求訊息數。您可以為存取 API Proxy 的所有應用程式設定相同配額,也可以根據下列條件設定配額:

  • 包含 API Proxy 的產品
  • 要求 API 的應用程式
  • 應用程式開發人員
  • 許多其他條件

請勿使用配額來防範整體流量遽增情形。如要這麼做,請使用尖峰流量防範政策。請參閱尖峰流量防範政策

影片

這些影片會介紹如何透過配額政策管理配額:

簡介 (新版 Edge)

簡介 (傳統版 Edge)

動態配額

分散式和同步

訊息權重

日曆

滾動週期

Flexi

條件配額

流程變數

處理錯誤

範例

這些政策程式碼範例說明如何透過下列方式開始和結束配額週期:

更多動態配額

<Quota name="CheckQuota">
  <Interval ref="verifyapikey.verify-api-key.apiproduct.developer.quota.interval">1</Interval>
  <TimeUnit ref="verifyapikey.verify-api-key.apiproduct.developer.quota.timeunit">hour</TimeUnit>
  <Allow count="200" countRef="verifyapikey.verify-api-key.apiproduct.developer.quota.limit"/>
</Quota>

動態配額可讓您設定單一配額政策,根據傳遞至配額政策的資訊,強制執行不同的配額設定。在這個脈絡中,「配額設定」也稱為「服務方案」。動態配額會檢查應用程式的「服務方案」,然後強制執行這些設定。

注意:如果同時為元素指定值和參照,系統會優先採用參照。如果參照在執行階段無法解析,系統就會使用該值。

舉例來說,建立 API 產品時,您可以選擇設定允許的配額上限、時間單位和間隔。不過,在 API 產品上設定這些值,並不會強制在 API Proxy 中使用這些值。您也必須在 API Proxy 中新增配額政策,讀取這些值。詳情請參閱「建立 API 產品」。

在上述範例中,包含配額政策的 API Proxy 會使用名為 verify-api-key 的 VerifyAPIKey 政策,驗證要求中傳遞的 API 金鑰。接著,配額政策會存取 VerifyAPIKey 政策中的流程變數,讀取 API 產品上設定的配額值。如要進一步瞭解 VerifyAPIKey 流程變數,請參閱「驗證 API 金鑰政策」。

您也可以在個別開發人員或應用程式上設定自訂屬性,然後在配額政策中讀取這些值。舉例來說,您想為每位開發人員設定不同的配額值。在本例中,您會在包含限制、時間單位和間隔的開發人員上設定自訂屬性。接著,您可以在配額政策中參照這些值,如下所示:

<Quota name="DeveloperQuota">
  <Identifier ref="verifyapikey.verify-api-key.client_id"/>
  <Interval ref="verifyapikey.verify-api-key.developer.timeInterval"/>
  <TimeUnit ref="verifyapikey.verify-api-key.developer.timeUnit"/>
  <Allow countRef="verifyapikey.verify-api-key.developer.limit"/>
</Quota>

這個範例也會使用 VerifyAPIKey 流程變數,參照開發人員設定的自訂屬性。

您可以使用任何變數設定配額政策的參數。這些變數可能來自:

  • 流程變數
  • API 產品、應用程式或開發人員的屬性
  • 鍵/值對應 (KVM)
  • 標頭、查詢參數、表單參數等

您可以為每個 API Proxy 新增配額政策,該政策可參照所有其他 Proxy 中所有其他配額政策的相同變數,也可以參照該政策和 Proxy 專屬的變數。

開始時間

<Quota name="QuotaPolicy" type="calendar">
  <StartTime>2017-02-18 10:30:00</StartTime>
  <Interval>5</Interval>
  <TimeUnit>hour</TimeUnit>
  <Allow count="99"/>
</Quota>

如果配額的 type 設為 calendar,您必須定義明確的 <StartTime> 值。時間值為 GMT 時間,而非當地時間。如果未提供 <StartTime> 值給 calendar 類型的政策,Edge 會發出錯誤。

系統會根據 <StartTime><Interval><TimeUnit> 值,重新整理每個應用程式的配額計數器。以這個例子來說,配額會在 2017 年 2 月 18 日格林威治標準時間上午 10:30 開始計算,並每 5 小時重新計算一次。因此,下次更新時間為 2017 年 2 月 18 日格林威治時間下午 3:30。

存取計數器

<Quota name="QuotaPolicy">
  <Interval>5</Interval>
  <TimeUnit>hour</TimeUnit>
  <Allow count="99"/>
</Quota>

API Proxy 可存取配額政策設定的流程變數。您可以在 API 代理程式中存取這些流程變數,執行條件式處理、監控政策是否即將達到配額限制、將目前的配額計數器傳回應用程式,或是基於其他原因。

由於存取政策的流程變數是根據政策的 name 屬性,因此對於上述名為 QuotaPolicy 的政策,您會以以下形式存取其流程變數:

  • ratelimit.QuotaPolicy.allowed.count:允許的金額。
  • ratelimit.QuotaPolicy.used.count:目前的計數器值。
  • ratelimit.QuotaPolicy.expiry.time:計數器重設時的世界協調時間。

如要存取其他流程變數,請參閱下文。

舉例來說,您可以使用下列 AssignMessage 政策,將配額流程變數的值做為回應標頭傳回:

<AssignMessage async="false" continueOnError="false" enabled="true" name="ReturnQuotaVars">
    <AssignTo createNew="false" type="response"/>
    <Set>
        <Headers>
            <Header name="QuotaLimit">{ratelimit.QuotaPolicy.allowed.count}</Header>
            <Header name="QuotaUsed">{ratelimit.QuotaPolicy.used.count}</Header>
            <Header name="QuotaResetUTC">{ratelimit.QuotaPolicy.expiry.time}</Header>
        </Headers>
    </Set>
    <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
</AssignMessage>

首次要求

<Quota name="MyQuota">
  <Interval>1</Interval>
  <TimeUnit>hour</TimeUnit>
  <Allow count="10000"/>
</Quota>

使用這個範例程式碼,強制每小時 10,000 次呼叫的配額。這項政策會在每個整點重設配額計數器。如果計數器在一小時結束前達到 10,000 次呼叫配額,超過 10,000 次的呼叫會遭到拒絕。

舉例來說,如果計數器從 2017-07-08 07:00:00 開始,則會在 2017-07-08 08:00:00 (開始時間後 1 小時) 重設為 0。如果系統在 2017-07-08 07:35:28 收到第一封訊息,且訊息數量在 2017-07-08 08:00:00 前達到 10,000 則,系統會拒絕超過該數量的呼叫,直到每小時開始時重設數量為止。

計數器重設時間取決於 <Interval><TimeUnit> 的組合。舉例來說,如果您將 <Interval> 設為 12,並將 <TimeUnit> 設為小時,則計數器每 12 小時就會重設一次。您可以將 <TimeUnit> 設為分鐘、小時、天、週或月。

您可以在 API Proxy 中的多個位置參照這項政策。舉例來說,您可以將其放在 Proxy PreFlow 中,以便在每個要求上執行。或者,您也可以將其放在 API Proxy 中的多個流程。如果您在 Proxy 中的多個位置使用這項政策,系統會維護單一計數器,並由政策的所有執行個體更新。

或者,您也可以在 API Proxy 中定義多項配額政策。每個配額政策都會根據政策的 name 屬性,維護自己的計數器。

設定 ID

<Quota name="QuotaPolicy" type="calendar">
  <Identifier ref="request.header.clientId"/>
  <StartTime>2017-02-18 10:00:00</StartTime>
  <Interval>5</Interval>
  <TimeUnit>hour</TimeUnit>
  <Allow count="99"/>
</Quota>

根據預設,配額政策會為 API Proxy 定義單一計數器,無論要求來源為何。或者,您也可以搭配配額政策使用 <Identifier> 屬性,根據 <Identifier> 屬性的值維護個別計數器。

舉例來說,您可以使用 <Identifier> 標記,為每個用戶端 ID 定義個別計數器。在對 Proxy 的要求中,用戶端應用程式會傳遞包含 clientID 的標頭,如上例所示。

您可以為 <Identifier> 屬性指定任何流程變數。舉例來說,您可以指定名為 id 的查詢參數包含專屬 ID:

<Identifier ref="request.queryparam.id"/>

如果您使用 VerifyAPIKey 政策驗證 API 金鑰,或使用 OAuth 權杖的 OAuthV2 政策,可以利用 API 金鑰或權杖中的資訊,為相同的配額政策定義個別計數器。舉例來說,下列 <Identifier> 標記會使用名為 verify-api-key 的 VerifyAPIKey 政策的 client_id 流程變數:

<Identifier ref="verifyapikey.verify-api-key.client_id"></Identifier>

每個不重複的 client_id 值現在都會在配額政策中定義自己的計數器。

類別

<Quota name="QuotaPolicy">
  <Interval>1</Interval>
  <TimeUnit>day</TimeUnit>
  <Allow>
    <Class ref="request.header.developer_segment">
      <Allow class="platinum" count="10000"/>
      <Allow class="silver" count="1000" />
    </Class>
  </Allow>
</Quota>

您可以使用以類別為準的配額計數,動態設定配額限制。在本例中,配額限制取決於隨每項要求傳遞的 developer_segment 標頭值。該變數的值可以是 platinumsilver。如果標頭包含無效值,政策會傳回配額違規錯誤。


關於配額政策

配額是指 API Proxy 在一段時間內 (例如每分鐘、每小時、每天、每週或每月) 可處理的要求訊息配額。這項政策會維護計數器,計算 API Proxy 收到的要求數。API 供應商可透過這項功能,在一段時間內對應用程式發出的 API 呼叫次數強制設限。舉例來說,您可以使用配額政策,將應用程式限制為每分鐘 1 個要求,或每月 10,000 個要求。

舉例來說,如果配額定義為每月 10,000 則訊息,則在第 10,000 則訊息之後,就會開始進行速率限制。無論是在該期間的第一天或最後一天達到 10,000 則訊息的上限,在配額計數器於指定時間間隔結束時自動重設前,或使用重設配額政策明確重設配額前,都無法提出額外要求。

SpikeArrest 是配額的變體,可防止流量尖峰 (或爆量),這類情況可能是因使用量突然增加、用戶端有錯誤或惡意攻擊所致。如要進一步瞭解尖峰流量防範政策,請參閱這篇文章

配額適用於個別 API Proxy,不會在 API Proxy 之間分配。舉例來說,如果 API 產品中有三個 API Proxy,即使這三個 Proxy 使用相同的配額政策設定,也不會共用單一配額。

配額政策類型

配額政策支援多種不同類型的政策:預設、calendarflexirollingwindow。如下表所示,每種配額類型都會定義配額計數器的啟動時間和重設時間:

時間單位 重設為預設值 (或空值) 日曆重設 彈性重設
分鐘 下一分鐘的開頭 <StartTime> 過後 1 分鐘 第一次要求後一分鐘
小時 下一個小時的整點 <StartTime>後一小時 發出第一個要求後一小時
當天格林威治標準時間午夜 <StartTime>後 24 小時 首次要求後 24 小時
每週結束時的週日格林威治標準時間午夜 <StartTime>過後一週 首次要求後一週
個月 當月最後一天的格林威治標準時間午夜 <StartTime>過後一個月 (28 天) 首次提出要求後一個月 (28 天)

您必須為 type="calendar" 指定 <StartTime> 的值。

下表未列出 rollingwindow 類型的值。滾動式配額的運作方式是設定配額「視窗」的大小,例如一小時或一天。當有新要求傳入時,政策會判斷過去「時間範圍」內是否已超出配額。

舉例來說,您可以定義兩小時的時段,允許 1000 個要求。下午 4:45 收到新要求。政策會計算過去兩小時的配額計數,也就是下午 2:45 以來的要求數。如果兩小時內未超過配額上限,系統就會允許要求。

一分鐘後,也就是下午 4:46,系統收到另一項要求。現在政策會計算下午 2:46 以來的配額數,判斷是否超過上限。

如果是 rollingwindow 類型,計數器不會重設,但每次提出要求時都會重新計算。

瞭解配額計數器

根據預設,無論您在 API Proxy 中參照配額政策的次數為何,配額政策都會維持單一計數器。配額計數器的名稱是以政策的 name 屬性為準。

舉例來說,您建立名為 MyQuotaPolicy 的配額政策,限制為 5 個要求,並將其放在 API Proxy 中的多個流程 (流程 A、B 和 C)。即使在多個流程中使用,該政策仍會維護單一計數器,並由所有政策執行個體更新:

  • 執行流程 A -> 執行 MyQuotaPolicy,計數器 = 1
  • 執行流程 B -> 執行 MyQuotaPolicy,計數器 = 2
  • 執行流程 A -> 執行 MyQuotaPolicy,計數器 = 3
  • 執行流程 C -> 執行 MyQuotaPolicy,計數器 = 4
  • 執行流程 A -> 執行 MyQuotaPolicy,計數器 = 5

由於配額計數器已達上限,因此系統會拒絕下一個對任一流程提出的要求。

在 API Proxy 流程的多個位置使用相同的配額政策,可能會導致配額用盡的速度超出預期,這是《The Book of Apigee Edge Antipatterns》一書中描述的反模式。

或者,您可以在 API Proxy 中定義多項配額政策,並在每個流程中使用不同的政策。每項配額政策都會根據政策的 name 屬性,維護自己的計數器。

或者,您也可以在配額政策中使用 <Class><Identifier> 元素,在單一政策中定義多個不重複的計數器。使用這些元素後,單一政策就能根據發出要求的應用程式、發出要求的應用程式開發人員、用戶端 ID 或其他用戶端 ID 等,維護不同的計數器。如要進一步瞭解如何使用 <Class><Identifier> 元素,請參閱上方的範例。

時間標記

所有配額時間都以世界標準時間 (UTC) 時區為準。

配額時間標記遵循國際標準日期標記,如國際標準 ISO 8601 所定義。

日期定義為年、月和日,格式如下:YYYY-MM-DD。 舉例來說,2015-02-04 代表 2015 年 2 月 4 日。

一天中的時間定義為時、分、秒,格式如下: hours:minutes:seconds。舉例來說,23:59:59 代表午夜前一秒。

請注意,有兩種表示法 (00:00:0024:00:00) 可用來區分與同一日期相關聯的兩個午夜。因此 2015-02-04 24:00:002015-02-05 00:00:00 的日期和時間相同。後者通常是較好的表示法。

從 API 產品設定取得配額設定

您可以在 API 產品設定中設定配額上限。這些限制不會自動強制執行配額。不過,您可以在配額政策中參照產品配額設定。為配額政策參照的產品設定配額,有以下優點:

  • 配額政策可以在 API 產品的所有 API Proxy 中使用統一設定。
  • 您可以對 API 產品的配額設定進行執行階段變更,而參照該值的配額政策會自動更新配額值。

如要進一步瞭解如何透過 API 產品使用配額設定,請參閱上方的「動態配額」範例。

如要瞭解如何設定配額限制的 API 產品,請參閱「建立 API 產品」。

元素參考資料

以下是您可以在這項政策中設定的元素和屬性。請注意,部分元素組合互斥或非必要。如需特定用法,請參閱範例。如果使用名為「VerifyAPIKey」的「驗證 API 金鑰」政策,檢查要求中的應用程式 API 金鑰,系統預設會提供下列 verifyapikey.VerifyAPIKey.apiproduct.* 變數。變數值來自與金鑰相關聯的 API 產品配額設定,如「從 API 產品設定取得配額設定」一文所述。

<Quota async="false" continueOnError="false" enabled="true" name="Quota-3" type="calendar">
   <DisplayName>Quota 3</DisplayName>
   <Allow count="2000" countRef="verifyapikey.VerifyAPIKey.apiproduct.developer.quota.limit"/>
   <Allow>
      <Class ref="request.queryparam.time_variable">
        <Allow class="peak_time" count="5000"/>
        <Allow class="off_peak_time" count="1000"/>
      </Class>
   </Allow>
   <Interval ref="verifyapikey.VerifyAPIKey.apiproduct.developer.quota.interval">1</Interval>
   <TimeUnit ref="verifyapikey.VerifyAPIKey.apiproduct.developer.quota.timeunit">month</TimeUnit>
   <StartTime>2017-7-16 12:00:00</StartTime>
   <Distributed>false</Distributed>
   <Synchronous>false</Synchronous>
   <AsynchronousConfiguration>
      <SyncIntervalInSeconds>20</SyncIntervalInSeconds>
      <SyncMessageCount>5</SyncMessageCount>
   </AsynchronousConfiguration>
   <Identifier/>
   <MessageWeight/>
</Quota>

<Quota> 屬性

<Quota async="false" continueOnError="false" enabled="true" name="Quota-3" type="calendar">

下列屬性適用於這項政策。

屬性 說明 預設 存在必要性
類型

用來判斷配額計數器檢查配額用量的時間和方式。詳情請參閱「配額政策類型」。

如果省略 type 值,計數器會從分鐘/小時/天/週/月的開頭開始計數。

有效值包括:

  • calendar:根據明確的開始時間設定配額。系統會根據您設定的 <StartTime><Interval><TimeUnit> 值,重新整理每個應用程式的配額計數器。
  • rollingwindow:設定配額,使用「滾動式時間範圍」判斷配額用量。使用 rollingwindow,透過 <Interval><TimeUnit> 元素決定時間範圍大小,例如 1 天。收到要求時,Edge 會查看要求確切時間 (例如下午 5:01),計算從前一天下午 5:01 到收到要求這段時間內的要求數量,並判斷該時間範圍內是否超出配額。
  • flexi:設定配額,讓計數器在收到應用程式的第一個要求訊息時開始計數,並根據 <Interval>, <TimeUnit> 值重設。
日曆 選用

下表說明所有政策父項元素的共同屬性:

屬性 說明 預設 存在必要性
name

政策的內部名稱。name 屬性的值可以 包含英文字母、數字、空格、連字號、底線和半形句號。此值不能 超過 255 個半形字元

視需要使用 <DisplayName> 元素,為政策加上標籤: 管理使用者介面 Proxy 編輯器,使用不同的自然語言名稱。

不適用 必填
continueOnError

如果設為「false」,系統會在政策失敗時傳回錯誤。這是可預期的情況 大多數政策的行為

如果設為 true,即使政策已發生,流程執行作業仍會繼續執行 失敗。

false 選用
enabled

如要強制執行政策,請設為 true

設為 false 即可停用政策。這項政策不會 仍會強制執行 政策。

true 選用
async

此屬性已淘汰。

false 已淘汰

&lt;DisplayName&gt;元素

name 屬性外,一併使用 管理 UI Proxy 編輯器,使用不同的自然語言名稱。

<DisplayName>Policy Display Name</DisplayName>
預設

不適用

如果省略這個元素,政策的 name 屬性值會是

存在必要性 選用
類型 字串

<Allow> 元素

指定配額的計數限制。如果政策的計數器達到這個限制值,系統會拒絕後續呼叫,直到計數器重設為止。

以下三種方式可設定 <Allow> 元素:

<Allow count="2000"/>
<Allow countRef="verifyapikey.VerifyAPIKey.apiproduct.developer.quota.limit"/>
<Allow count="2000" countRef="verifyapikey.VerifyAPIKey.apiproduct.developer.quota.limit"/>

如果同時指定 countcountRef,則 countRef 優先。如果 countRef 無法在執行階段解析,系統會使用 count 的值。

預設值: 不適用
外觀狀態: 選用
類型: 整數

屬性

屬性 說明 預設 存在必要性
數量

用於指定配額的訊息數量。

舉例來說,如果 count 屬性值為 100、Interval 為 1,且 TimeUnit 為「month」,則配額為每月 100 則訊息。

2000 選用
countRef

用於指定含有配額訊息計數的流程變數。 countRef 的優先順序高於 count 屬性。

選用

<Allow>/<Class> 元素

<Class> 元素可讓您根據流程變數的值,設定 <Allow> 元素的值。對於 <Class> 的每個不同 <Allow> 子項標記,政策會維持不同的計數器。

如要使用 <Class> 元素,請使用 <Class> 標記的 ref 屬性指定流程變數。然後,Edge 會使用流程變數的值選取其中一個 <Allow> 子標記,判斷政策允許的數量。Edge 會將流程變數的值與 <Allow> 代碼的 class 屬性相符,如下所示:

<Allow>
  <Class ref="request.queryparam.time_variable">
    <Allow class="peak_time" count="5000"/>
    <Allow class="off_peak_time" count="1000"/>
  </Class>
</Allow>

在本例中,系統會根據每次要求傳遞的 time_variable 查詢參數值,判斷目前的配額計數器。該變數的值可以是 peak_timeoff_peak_time。如果查詢參數含有無效值,政策會傳回配額違規錯誤。

預設值: 不適用
外觀狀態: 選用
類型: 不適用

屬性

屬性 說明 預設 存在必要性
ref

用於指定包含配額配額類別的流程變數。

必填

<Allow>/<Class>/<Allow> 元素

<Allow> 元素會指定 <Class> 元素定義的配額計數器限制。對於 <Class> 的每個不同 <Allow> 子項標記,政策會維護不同的計數器。

例如:

<Allow>
  <Class ref="request.queryparam.time_variable">
    <Allow class="peak_time" count="5000"/>
    <Allow class="off_peak_time" count="1000"/>
  </Class>
</Allow>

在這個範例中,配額政策會維護兩個配額計數器,分別命名為 peak_timeoff_peak_time

預設值: 不適用
外觀狀態: 選用
類型: 不適用

屬性

屬性 說明 預設 存在必要性
類別

定義配額計數器的名稱。

必填
數量 指定計數器的配額限制。 必填

<Interval> 元素

指定與您指定的 TimeUnit 配對的整數 (例如 1、2、5、60 等),以決定 Edge 計算配額用量的時間範圍 (分鐘、小時、天、週或月)。

舉例來說,Interval24TimeUnithour,表示配額會在 24 小時內計算。

<Interval ref="verifyapikey.VerifyAPIKey.apiproduct.developer.quota.interval">1</Interval>
預設值:
外觀狀態: 必填
類型: 整數

屬性

屬性 說明 預設 存在必要性
ref

用於指定包含配額間隔的流程變數。ref 的優先順序高於明確間隔值。如果同時指定參照和值,系統會優先採用參照。 如果 ref 無法在執行階段解析,則會使用該值。

選用

<TimeUnit> 元素

用於指定適用於配額的時間單位。

舉例來說,Interval24TimeUnithour,表示配額會在 24 小時內計算。

<TimeUnit ref="verifyapikey.VerifyAPIKey.apiproduct.developer.quota.timeunit">month</TimeUnit>
預設值:
外觀狀態: 必填
類型:

字串。選取 minutehourdayweekmonth

屬性

屬性 說明 預設 存在必要性
ref 用來指定含有配額時間單位的流程變數。ref 的優先順序高於明確間隔值。如果 ref 無法在執行階段解析,則會使用該值。 選用

<StartTime> 元素

如果 type 設為 calendar,,配額計數器就會開始計數,無論是否收到任何應用程式的要求。

例如:

<StartTime>2017-7-16 12:00:00</StartTime>
預設值:
外觀狀態: 如果 type 設為 calendar,則為必要屬性。
類型:

採用 ISO 8601 日期和時間格式的字串。

<Distributed> 元素

Edge 安裝作業可使用一或多個訊息處理器來處理要求。將這個元素設為 true,指定政策應維護中央計數器,並持續在所有訊息處理器之間同步。訊息處理器可以跨可用區和/或區域。

如果您使用 false 的預設值,則可能超出配額,因為每個訊息處理器的計數不會共用:

<Distributed>true</Distributed>

如要確保計數器同步處理,並在每次要求時更新,請將 <Distributed><Synchronous> 設為 true:

<Distributed>true</Distributed>
<Synchronous>true</Synchronous>
預設值: false
外觀狀態: 選用
類型: 布林值

<Synchronous> 元素

設為 true 可同步更新分散式配額計數器。也就是說,系統會在檢查 API 要求配額的同時更新計數器。如果絕對不能允許任何 API 呼叫超出配額,請設為 true

設為 false,以非同步方式更新配額計數器。也就是說,視中央存放區的配額計數器非同步更新時間而定,部分超出配額的 API 呼叫可能會通過。不過,您不會面臨與同步更新相關的潛在效能影響。

預設的非同步更新間隔為 10 秒。請使用 AsynchronousConfiguration 元素設定這項非同步行為。

<Synchronous>false</Synchronous>
預設值: false
外觀狀態: 選用
類型: 布林值

<AsynchronousConfiguration> 元素

如果政策設定元素 <Synchronous> 不存在,或存在但設為 false,則設定分散式配額計數器之間的同步間隔。

您可以使用 SyncIntervalInSecondsSyncMessageCount 子項元素,在一段時間或達到特定訊息數量後進行同步。兩者互斥。例如:

<AsynchronousConfiguration>
   <SyncIntervalInSeconds>20</SyncIntervalInSeconds>
</AsynchronousConfiguration>

<AsynchronousConfiguration>
   <SyncMessageCount>5</SyncMessageCount>
</AsynchronousConfiguration>
預設值: SyncIntervalInSeconds = 10 秒
外觀狀態: 選填;如果 <Synchronous> 設為 true,系統會忽略這個欄位。
類型:

建築

<AsynchronousConfiguration>/<SyncIntervalInSeconds> 元素

使用此屬性覆寫預設行為,也就是在間隔 10 秒後執行非同步更新。

<AsynchronousConfiguration>
   <SyncIntervalInSeconds>20</SyncIntervalInSeconds>
</AsynchronousConfiguration>

如「限制」主題所述,同步間隔必須 >= 10 秒。

預設值: 10
外觀狀態: 選用
類型:

整數

<AsynchronousConfiguration>/<SyncMessageCount> 元素

指定配額更新之間,所有 Apigee 訊息處理器的要求數量。

<AsynchronousConfiguration>
   <SyncMessageCount>5</SyncMessageCount>
</AsynchronousConfiguration>

這個範例指定每 5 個要求更新一次配額計數,適用於每個 Apigee Edge 訊息處理器。

預設值: 不適用
外觀狀態: 選用
類型:

整數

<Identifier> 元素

使用 <Identifier> 元素設定政策,根據流程變數建立不重複的計數器。

您可以為流程變數定義的特徵建立專屬計數器。舉例來說,您可能會使用開發人員電子郵件地址,將配額與特定開發人員建立關聯。無論是使用自訂變數或預先定義的變數 (例如 Verify API Key 政策提供的變數),您都可以使用各種變數來識別配額。另請參閱變數參考資料

如果您未使用這個元素,政策會使用單一計數器,並套用至配額。

如要進一步瞭解這個元素,請參閱 Apigee 社群貼文: 不同政策的配額 ID

<Identifier ref="verifyapikey.verify-api-key.client_id"/>
預設值: 不適用
外觀狀態: 選用
類型:

字串

屬性

屬性 說明 預設 存在必要性
ref

指定用於要求的計數器流程變數。這個 ID 可以是 HTTP 標頭、查詢參數、表單參數或訊息內容,且每個應用程式、應用程式使用者、應用程式開發人員、API 產品或其他特徵都必須有專屬 ID。

最常使用的 <Identifier>client_id,可用來識別應用程式。client_id 是 API 金鑰或用戶端金鑰的別名,當應用程式在 Apigee Edge 的機構中註冊時,系統會為該應用程式產生這類金鑰。如果您已為 API 啟用 API 金鑰或 OAuth 授權政策,即可使用這個 ID。

在某些情況下,必須在沒有 client_id 的情況下擷取配額設定,例如沒有安全政策時。在這些情況下,您可以使用「存取實體」政策擷取適當的 API 產品設定,然後使用 ExtractVariables 擷取值,並在配額政策中使用擷取的環境變數。詳情請參閱「存取實體政策」。

不適用 選用

<MessageWeight> 元素

用於指定指派給每則訊息的權重。使用訊息權重,提高要求訊息的影響力,例如比其他訊息消耗更多運算資源的訊息。

舉例來說,您希望 POST 訊息的「負擔」或費用是 GET 訊息的兩倍。因此,您會將 POST 的 MessageWeight 設為 2,GET 的 MessageWeight 設為 1。您甚至可以將 MessageWeight 設為 0,這樣要求就不會影響計數器。在這個範例中,如果配額為每分鐘 10 則訊息,且 POST 要求的 MessageWeight2,則配額允許在任何 10 分鐘間隔內提出 5 項 POST 要求。計數器重設前,系統會拒絕任何額外的 POST 或 GET 要求。

代表 MessageWeight 的值必須由流程變數指定,且可從 HTTP 標頭、查詢參數、XML 或 JSON 要求酬載,或任何其他流程變數中擷取。舉例來說,您可以在名為 weight 的標頭中設定:

<MessageWeight ref="message_weight"/>
預設值: 不適用
外觀狀態: 選用
類型:

整數

流程變數

配額政策執行時,系統會自動填入下列預先定義的流程變數。如要進一步瞭解流程變數,請參閱「變數參考資料」。

變數 類型 權限 說明
ratelimit.{policy_name}.allowed.count 唯讀 傳回允許的配額計數
ratelimit.{policy_name}.used.count 唯讀 傳回配額間隔內目前使用的配額
ratelimit.{policy_name}.available.count 唯讀 傳回配額間隔內的可用配額數
ratelimit.{policy_name}.exceed.count 唯讀 超過配額時,會傳回 1。
ratelimit.{policy_name}.total.exceed.count 唯讀 超過配額時,會傳回 1。
ratelimit.{policy_name}.expiry.time 唯讀

傳回世界標準時間 (以毫秒為單位),用於判斷配額何時到期,以及新的配額間隔何時開始。

如果配額政策類型為 rollingwindow,這個值無效,因為配額間隔永遠不會到期。

ratelimit.{policy_name}.identifier 字串 唯讀 傳回附加至政策的 (用戶端) 參照 ID
ratelimit.{policy_name}.class 字串 唯讀 傳回與用戶端 ID 相關聯的類別
ratelimit.{policy_name}.class.allowed.count 唯讀 傳回類別中定義的允許配額數
ratelimit.{policy_name}.class.used.count 唯讀 傳回類別中已使用的配額
ratelimit.{policy_name}.class.available.count 唯讀 傳回類別中的可用配額數
ratelimit.{policy_name}.class.exceed.count 唯讀 傳回目前配額間隔內,類別中超出限制的要求數
ratelimit.{policy_name}.class.total.exceed.count 唯讀 傳回所有配額間隔中,超過類別限制的要求總數,因此是所有配額間隔的 class.exceed.count 總和。
ratelimit.{policy_name}.failed 布林值 唯讀

指出政策是否失敗 (true 或 false)。

錯誤參考資料

This section describes the fault codes and error messages that are returned and fault variables that are set by Edge when this policy triggers an error. This information is important to know if you are developing fault rules to handle faults. To learn more, see What you need to know about policy errors and Handling faults.

Runtime errors

These errors can occur when the policy executes.

Fault code HTTP status Cause Fix
policies.ratelimit.FailedToResolveQuotaIntervalReference 500 Occurs if the <Interval> element is not defined within the Quota policy. This element is mandatory and used to specify the interval of time applicable to the quota. The time interval can be minutes, hours, days, weeks, or months as defined with the <TimeUnit> element.
policies.ratelimit.FailedToResolveQuotaIntervalTimeUnitReference 500 Occurs if the <TimeUnit> element is not defined within the Quota policy. This element is mandatory and used to specify the unit of time applicable to the quota. The time interval can be in minutes, hours, days, weeks, or months.
policies.ratelimit.InvalidMessageWeight 500 Occurs if the value of the <MessageWeight> element specified through a flow variable is invalid (a non-integer value).
policies.ratelimit.QuotaViolation 500 The quota limit was exceeded. N/A

Deployment errors

Error name Cause Fix
InvalidQuotaInterval If the quota interval specified in the <Interval> element is not an integer, then the deployment of the API proxy fails. For example, if the quota interval specified is 0.1 in the <Interval> element, then the deployment of the API proxy fails.
InvalidQuotaTimeUnit If the time unit specified in the <TimeUnit> element is unsupported, then the deployment of the API proxy fails. The supported time units are minute, hour, day, week, and month.
InvalidQuotaType If the type of the quota specified by the type attribute in the <Quota> element is invalid, then the deployment of the API proxy fails. The supported quota types are default, calendar, flexi, and rollingwindow.
InvalidStartTime If the format of the time specified in the <StartTime> element is invalid, then the deployment of the API proxy fails. The valid format is yyyy-MM-dd HH:mm:ss, which is the ISO 8601 date and time format. For example, if the time specified in the <StartTime> element is 7-16-2017 12:00:00 then the deployment of the API proxy fails.
StartTimeNotSupported If the <StartTime> element is specified whose quota type is not calendar type, then the deployment of the API proxy fails. The <StartTime> element is supported only for the calendar quota type. For example, if the type attribute is set to flexi or rolling window in the <Quota> element, then the deployment of the API proxy fails.
InvalidTimeUnitForDistributedQuota If the <Distributed> element is set to true and the <TimeUnit> element is set to second then the deployment of the API proxy fails. The timeunit second is invalid for a distributed quota.
InvalidSynchronizeIntervalForAsyncConfiguration If the value specified for the <SyncIntervalInSeconds> element within the <AsynchronousConfiguration> element in a Quota policy is less than zero, then the deployment of the API proxy fails.
InvalidAsynchronizeConfigurationForSynchronousQuota If the value of the <AsynchronousConfiguration> element is set to true in a Quota policy, which also has asynchronous configuration defined using the <AsynchronousConfiguration> element, then the deployment of the API proxy fails.

Fault variables

These variables are set when this policy triggers an error. For more information, see What you need to know about policy errors.

Variables Where Example
fault.name="fault_name" fault_name is the name of the fault, as listed in the Runtime errors table above. The fault name is the last part of the fault code. fault.name Matches "QuotaViolation"
ratelimit.policy_name.failed policy_name is the user-specified name of the policy that threw the fault. ratelimit.QT-QuotaPolicy.failed = true

Example error response

{  
   "fault":{  
      "detail":{  
         "errorcode":"policies.ratelimit.QuotaViolation"
      },
      "faultstring":"Rate limit quota violation. Quota limit  exceeded. Identifier : _default"
   }
}

Example fault rule

<FaultRules>
    <FaultRule name="Quota Errors">
        <Step>
            <Name>JavaScript-1</Name>
            <Condition>(fault.name Matches "QuotaViolation") </Condition>
        </Step>
        <Condition>ratelimit.Quota-1.failed=true</Condition>
    </FaultRule>
</FaultRules>

結構定義

相關主題

ResetQuota 政策

SpikeArrest 政策

比較配額、Spike Arrest 和並行速率限制政策