配額政策

您目前查看的是 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)。

錯誤參考資料

本節說明在這項政策觸發錯誤時,所傳回的錯誤代碼和錯誤訊息,以及 Edge 所設定的錯誤變數。 請務必瞭解這份資訊,以便瞭解您是否要擬定錯誤規則, 處理錯誤詳情請參閱這篇文章 瞭解政策錯誤處理方式 發生錯誤

執行階段錯誤

執行政策時,可能會發生這些錯誤。

錯誤程式碼 HTTP 狀態 原因 修正
policies.ratelimit.FailedToResolveQuotaIntervalReference 500 如果未在配額政策中定義 <Interval> 元素,就會發生這個錯誤。這個元素 是必要項目,用於指定配額適用的時間間隔。時間間隔 可以是分鐘、小時、天、週或月 (與 <TimeUnit> 元素中定義的)。
policies.ratelimit.FailedToResolveQuotaIntervalTimeUnitReference 500 如果未在配額政策中定義 <TimeUnit> 元素,就會發生這個錯誤。這個元素 為必要項目,用於指定配額適用的時間單位。時間間隔 可以是分鐘、小時、天、週或月。
policies.ratelimit.InvalidMessageWeight 500 如果透過資料流變數指定的 <MessageWeight> 元素值發生,就會發生這類情況 無效 (非整數值)。
policies.ratelimit.QuotaViolation 500 超過配額上限。 不適用

部署錯誤

錯誤名稱 原因 修正
InvalidQuotaInterval 如未在 <Interval> 元素中指定的配額間隔 整數,則 API Proxy 的部署作業將會失敗。舉例來說 在 <Interval> 元素中指定的是 0.1,那麼 API Proxy 故障。
InvalidQuotaTimeUnit 如果 <TimeUnit> 元素中指定的時間單位不受支援, 那麼 API Proxy 的部署作業就會失敗支援的時間單位為 minutehourdayweekmonth
InvalidQuotaType 如果 <Quota>type 屬性指定的配額類型 元素無效,即可部署 API Proxy。 支援的配額類型為 defaultcalendarflexirollingwindow
InvalidStartTime 如果 <StartTime> 元素中指定的時間格式是 無效,API Proxy 的部署作業就會失敗。有效格式為 yyyy-MM-dd HH:mm:ss。 採用 ISO 8601 日期和時間格式。適用對象 舉例來說,如果 <StartTime> 元素中指定的時間為 7-16-2017 12:00:00,則 API Proxy 的部署作業失敗。
StartTimeNotSupported 如果指定 <StartTime> 元素的配額類型並非 calendar 類型,即表示 API Proxy 的部署作業失敗。<StartTime> 元素是 僅支援「calendar」配額類型。舉例來說,如果設定 type 屬性 設為 flexirolling window,然後<Quota> API Proxy 部署作業失敗。
InvalidTimeUnitForDistributedQuota 如果 <Distributed> 元素設為 true,且 <TimeUnit> 元素設為 second,則 API Proxy 的部署作業會失敗。「second」的時間單位無效 分散式配額
InvalidSynchronizeIntervalForAsyncConfiguration 如果<SyncIntervalInSeconds> 配額政策中的 <AsynchronousConfiguration> 元素小於 0, API Proxy 部署作業失敗。
InvalidAsynchronizeConfigurationForSynchronousQuota 如果在配額政策中將 <AsynchronousConfiguration> 元素的值設為 true, 已使用 <AsynchronousConfiguration> 元素定義非同步設定,然後 API Proxy 部署作業失敗

錯誤變數

當這項政策觸發錯誤時,系統會設定這些變數。詳情請參閱重要須知 政策錯誤。

變數 地點 範例
fault.name="fault_name" fault_name 是錯誤的名稱,如上方「執行階段錯誤」表格所列。錯誤名稱是錯誤程式碼的最後部分。 fault.name Matches "QuotaViolation"
ratelimit.policy_name.failed policy_name 是使用者指定錯誤的政策名稱。 ratelimit.QT-QuotaPolicy.failed = true

錯誤回應範例

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

錯誤規則範例

<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 和並行速率限制政策