查看 Apigee Edge 說明文件。
前往
Apigee X說明文件。 資訊
使用 <Rate>
元素可防範流量激增的情況,這個
元素限制了 API Proxy 處理並傳送至後端的要求數量。
防止效能延遲和停機時間
<SpikeArrest>
個元素
定義尖峰流量防範政策。
預設值 | 請參閱下方的預設政策分頁 |
是否必填? | 選用 |
類型 | 複合式園區 物體 |
父項元素 | 不適用 |
子元素 |
<Identifier>
<MessageWeight> <Rate> (必填)<UseEffectiveCount> 敬上 |
語法
<SpikeArrest>
元素使用下列語法:
<SpikeArrest continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <DisplayName>display_name</DisplayName> <Properties/> <Identifier ref="flow_variable"/> <MessageWeight ref="flow_variable"/> <Rate ref="flow_variable">rate[pm|ps]</Rate> <UseEffectiveCount>[false|true]</UseEffectiveCount> </SpikeArrest>
預設政策
以下範例顯示您在 開始在 Edge UI 中的流程:
<SpikeArrest async="false" continueOnError="false" enabled="true" name="Spike-Arrest-1"> <DisplayName>Spike Arrest-1</DisplayName> <Properties/> <Identifier ref="request.header.some-header-name"/> <MessageWeight ref="request.header.weight"/> <Rate>30ps</Rate> <UseEffectiveCount>true</UseEffectiveCount> </SpikeArrest>
此元素在所有政策中皆包含下列屬性:
屬性 | 預設 | 必填與否 | Description |
---|---|---|---|
name |
無 | 必要 |
政策的內部名稱。 或者,您也可以使用 |
continueOnError |
false | 選填 | 如果設為「false」,當政策失敗時會傳回錯誤。多數政策預期的行為如下。如果設為「true」,則在政策失敗後,仍會繼續執行流程。 |
enabled |
true | 選填 | 設為「true」即可強制執行政策。將政策設為「false」,即可「關閉」政策。即使政策已附加至流程,系統也不會強制執行這項政策。 |
async |
false | 已淘汰 | 這項屬性已淘汰。 |
範例
以下範例說明使用「暴雨逮捕」政策的部分方式:
範例 1
以下範例將速率設為每秒 5 次:
<SpikeArrest name="Spike-Arrest-1"> <Rate>5ps</Rate> </SpikeArrest>
這項政策的目標是每隔 200 毫秒一次允許一個要求。 (1000/5)。
範例 2
以下範例將頻率設為每分鐘 12 次:
<SpikeArrest name="Spike-Arrest-1"> <Rate>12pm</Rate> </SpikeArrest>
此範例政策會將速率平滑處理每五項要求 seconds (60/12)。
範例 3
以下範例會將要求限制為每分鐘 12 次 (每五項要求允許一個要求) 秒或 60/12):
<SpikeArrest name="Spike-Arrest-1"> <Rate>12pm</Rate> <Identifier ref="client_id" /> <MessageWeight ref="request.header.weight" /> </SpikeArrest>
此外,<MessageWeight>
元素接受自訂值 (
weight
標頭),為特定應用程式或用戶端調整郵件權重。這個
針對與
<Identifier>
元素。
示例 4
以下範例會指示 Spike Arrest 尋找透過
以 request.header.runtime_rate
流程變數的形式傳遞的要求:
<SpikeArrest name="Spike-Arrest-1"> <Rate ref="request.header.runtime_rate" /> </SpikeArrest>
流程變數的值必須採用 intpm
或
intps
。
如要嘗試這個範例,請執行下列要求:
curl http://myorg-myenv.apigee.net/price -H 'runtime_rate:30ps'
子元素參照
本節將說明 <SpikeArrest>
的子元素。
<DisplayName>
除 name
屬性外,一併使用
管理 UI Proxy 編輯器,使用不同的自然名稱。
<DisplayName>
元素適用於所有政策。
預設值 | 不適用 |
是否必填? | 選用設定。如果您省略 <DisplayName> ,
使用政策的 name 屬性 |
類型 | 字串 |
父項元素 | <PolicyElement> |
子元素 | 無 |
<DisplayName>
元素使用下列語法:
語法
<PolicyElement> <DisplayName>policy_display_name</DisplayName> ... </PolicyElement>
範例
<PolicyElement> <DisplayName>My Validation Policy</DisplayName> </PolicyElement>
<DisplayName>
元素不含任何屬性或子元素。
<Identifier>
讓您選擇要求的分組方式,以便根據何者套用尖峰流量政策 呼叫。舉例來說,您可以按開發人員 ID 將要求分組, 開發人員的要求將計入自己的「尖峰尖峰心」率,而非所有傳送至 Proxy 上。
與 <MessageWeight>
元素搭配使用,更精細
控管要求節流
如果將 <Identifier>
元素留空,系統會針對所有要求強制執行一項頻率限制
傳送至該 API Proxy
預設值 | 不適用 |
是否必填? | 選用 |
類型 | 字串 |
父項元素 |
<SpikeArrest>
|
子元素 | 無 |
語法
<SpikeArrest continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <Identifier ref="flow_variable"/> </SpikeArrest>
範例 1
以下範例為每個開發人員 ID 套用尖峰流量防範政策:
<SpikeArrest name="Spike-Arrest-1"> <Identifier ref="developer.id"/> <Rate>42pm</Rate/> </SpikeArrest>
下表說明 <Identifier>
的屬性:
屬性 | 說明 | 預設 | 存在必要性 |
---|---|---|---|
ref |
找出 Spike Arrest 將傳入要求分組的變數, 您可以使用任何流程變數來表示不重複的用戶端,例如與 VerifyAPIKey 政策。您也可以使用 JavaScript 政策或 AssignMessage 政策。 | 不適用 | 必填 |
此外,也會在以下 Apigee 社群文章中討論這項元素:http://community.apigee.com/questions/2807/how-does-the-edge-quota-policy-work-when-no-identi.html。
<MessageWeight>
指定每則訊息定義的權重。訊息權重改變了影響 只處理單一要求的尖峰期攻擊率訊息權重可以是任何值 流程變數,例如 HTTP 標頭、查詢參數、表單參數或郵件內文。 您也可以使用 JavaScript 政策或 AssignMessage 政策。
與 <Identifier>
搭配使用,可
特定用戶端或應用程式
舉例來說,如果峰值尖峰 <Rate>
為 10pm
,而應用程式提交了
權重為 2
的要求,之後每分鐘只會有 5 則訊息
因為每個要求會計為 2 次。
預設值 | 不適用 |
是否必填? | 選用 |
類型 | 整數 |
父項元素 |
<SpikeArrest>
|
子元素 | 無 |
語法
<SpikeArrest continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <MessageWeight ref="flow_variable"/> </SpikeArrest>
範例 1
以下範例會將要求限制為每分鐘 12 次 (每五項要求允許一個要求) 秒或 60/12):
<SpikeArrest name="Spike-Arrest-1"> <Rate>12pm</Rate> <Identifier ref="client_id" /> <MessageWeight ref="request.header.weight" /> </SpikeArrest>
在此範例中,<MessageWeight>
接受自訂值 (weight
標頭) 來調整特定用戶端的郵件權重。這個
針對與
<Identifier>
元素。
下表說明 <MessageWeight>
的屬性:
屬性 | 說明 | 存在必要性 | 預設 |
---|---|---|---|
ref |
識別包含特定用戶端訊息權重的流程變數。 可以是任何流量變數,例如 做為 HTTP 查詢參數、標頭或郵件內文。若需更多資訊,請參閲 流程變數參考資料。您也可以設定自訂變數 使用 JavaScript 政策或 AssignMessage 政策。 | 必填 | 不適用 |
<Rate>
指定流量遽增 (或突發) 的速率,方法是設定
每分鐘或每秒允許的要求數。您也可以在
結合 <Identifier>
和 <MessageWeight>
,即可
藉由接受用戶端的值,便可以在執行階段順利調節流量。
預設值 | 不適用 |
是否必填? | 必填 |
類型 | 整數 |
父項元素 |
<SpikeArrest>
|
子元素 | 無 |
語法
你可以使用下列任一方式指定房價:
- 您指定為
<Rate>
元素主體的靜態費率 - 可由用戶端傳遞的變數值;找出
使用
ref
屬性的流程變數名稱
<SpikeArrest continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <Rate ref="flow_variable">rate[pm|ps]</Rate> </SpikeArrest>
有效的費率值必須 (定義為變數值或元素主體) 必須 符合下列格式:
intps
(每秒要求數,順暢為間隔) 毫秒)intpm
(每分鐘的要求數,順暢為間隔) 秒)
int 的值必須是正、非零的整數。
範例 1
以下範例會將速率設定為每秒 5 個要求:
<SpikeArrest name="Spike-Arrest-1"> <Rate>5ps</Rate> </SpikeArrest>
這項政策的目標是每隔 200 毫秒一次允許一個要求。 (1000/5)。
範例 2
以下範例會將頻率設為每分鐘 12 個要求:
<SpikeArrest name="Spike-Arrest-1"> <Rate>12pm</Rate> </SpikeArrest>
此範例政策會將速率平滑處理每五項要求 seconds (60/12)。
下表說明 <Rate>
的屬性:
屬性 | 說明 | 存在必要性 | 預設 |
---|---|---|---|
ref |
識別指定速率的流程變數。可以是任何流程
變數,例如 HTTP 查詢參數、標頭或郵件內文或值
例如 KVM詳情請參閱流程變數參考資料。
你也可以使用自訂變數 使用 JavaScript 政策或 AssignMessage 政策。 如果您同時定義 例如: <Rate ref="request.header.custom_rate">1pm</Rate> 在本例中,如果用戶端「未」傳送「custom_rate」然後是標頭 所有用戶端的 API Proxy 頻率為每分鐘 1 個要求。如果用戶端將 「custom_rate」標頭,那麼針對 Proxy 存取,直到回應不含「custom_rate」的要求標頭。 您可以使用 如果您指定 |
選用 | 不適用 |
<UseEffectiveCount>
使用自動調整資源配置功能時,將尖峰通知平均分配給訊息處理器 (MP) 群組。
語法
<SpikeArrest continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <UseEffectiveCount>[false|true]</UseEffectiveCount> </SpikeArrest>
範例 1
以下範例將 <UseEffectiveCount>
設為 true:
<SpikeArrest name='Spike-Arrest-1'> <Rate>40ps</Rate> <UseEffectiveCount>true</UseEffectiveCount> </SpikeArrest>
<UseEffectiveCount>
為選用元素。預設值為 false
。
就會觸發這個事件。
預設值 | 否 |
是否必填? | 選用 |
類型 | 布林值 |
父項元素 |
<SpikeArrest>
|
子元素 | 無 |
下表將說明 <UseEffectiveCount>
元素的屬性:
屬性 | 說明 | 預設 | 存在必要性 |
---|---|---|---|
ref |
識別包含 <UseEffectiveCount> 值的變數。可用的值包括
任何流程變數,例如 HTTP 查詢參數、標頭或郵件內文內容。如要
請參閱流程變數參考資料。您也可以設定自訂變數
使用 JavaScript 政策或 AssignMessage 政策。 |
不適用 | 選用 |
<UseEffectiveCount>
的效果取決於其值:
true
:MP 的峰值頻率限制是指<Rate>
除以同一廣告連播中的目前百萬像素數量。匯總限制是指 (共<Rate>
個)。動態增加 (或移除) 營利成效會個別激增 頻率限制將會提高 (或降低),但匯總限制則維持不變。false
(省略時此為預設值):每百萬次觀看頻率的高峰頻率限制為 就是其<Rate>
的值。 匯總限量是指所有百萬像素比率的總和。增加 (或移除) 營利模式時 各自的高點頻率限制將維持不變,但匯總上限則會提高 ( 減少)。
下表列出 <UseEffectiveCount>
對有效頻率限制
:
<UseEffectiveCount> 的值 |
||||||
---|---|---|---|---|---|---|
false |
false |
false |
true |
true |
true |
|
百萬像素數 | 8 | 4 | 2 | 8 | 4 | 2 |
<Rate> 的值 |
10 | 10 | 10 | 40 | 40 | 40 |
每百萬像素效益 | 10 | 10 | 10 | 5 | 10 | 20 |
匯總限制 | 80 | 40 | 20 | 40* | 40* | 40* |
* 與 <Rate> 相同。 |
請注意,在這個例子中,MP 授權數從 4 減少為 2
<UseEffectiveCount>
為 false
,每 MP 平均費率仍相同 (
10)。但當 <UseEffectiveCount>
為 true
時,每百萬像素的實際費率是
百萬像素數量從 4 人減少至 20 時,則設為 10 至 20 人。
流程變數
執行 Spike Arrest 政策時,系統會填入下列流量變數:
變數 | 類型 | 權限 | 說明 |
---|---|---|---|
ratelimit.policy_name.failed |
布林值 | 唯讀 | 指出政策是否失敗 (true 或
false )。 |
詳情請參閱流程變數參考資料。
錯誤參考資料
本節說明系統傳回的錯誤代碼和錯誤訊息,以及錯誤變數。 這項政策觸發錯誤時,由 Edge 設定的。 請務必瞭解這份資訊,以便瞭解您是否要擬定錯誤規則, 處理錯誤詳情請參閱: 注意事項 瞭解政策錯誤和處理方式 發生錯誤
執行階段錯誤
執行政策時,可能會發生這些錯誤。
錯誤程式碼 | HTTP 狀態 | 原因 | 修正 |
---|---|---|---|
policies.ratelimit.FailedToResolveSpikeArrestRate |
500 |
如果參照包含費率設定的變數,就會發生這個錯誤
無法將 <Rate> 元素中的值解析為尖峰時段中的某個值
政策。此為必要元素,可用來指定
格式為 intpm 或 intps 。 |
build |
policies.ratelimit.InvalidMessageWeight |
500 |
如果透過以下其中一種方式為 <MessageWeight> 元素指定值,就會發生這項錯誤。
流量變數無效 (非整數值)。 |
build |
policies.ratelimit.SpikeArrestViolation |
429 |
超過頻率限制。 |
部署錯誤
當您部署含有這項政策的 Proxy 時,可能會發生這些錯誤。
錯誤名稱 | 原因 | 修正 |
---|---|---|
InvalidAllowedRate |
如果在尖峰峰頂攻擊的 <Rate> 元素中指定峰值逮捕率
政策不是整數。如果費率沒有「ps 」或「pm 」做為後置字串,
那麼 API Proxy 的部署作業就會失敗 |
build |
錯誤變數
系統會在發生執行階段錯誤時設定這些變數。詳情請參閱重要須知 政策錯誤。
錯誤回應範例
錯誤回應範例如下:
{ "fault":{ "detail":{ "errorcode":"policies.ratelimit.SpikeArrestViolation" }, "faultstring":"Spike arrest violation. Allowed rate : 10ps" } }
錯誤規則範例
下方為處理 SpikeArrestViolation
錯誤的錯誤規則範例:
<FaultRules> <FaultRule name="Spike Arrest Errors"> <Step> <Name>JavaScript-1</Name> <Condition>(fault.name Matches "SpikeArrestViolation") </Condition> </Step> <Condition>ratelimit.Spike-Arrest-1.failed=true</Condition> </FaultRule> </FaultRules>
超過配額或尖峰流量政策設定的頻率限制時,適用的 HTTP 狀態碼
為 429
(「要求數超量」)。如何將 HTTP 狀態碼變更為 500
(內部伺服器錯誤),請將
使用以下函式將 features.isHTTPStatusTooManyRequestEnabled
資源加到 false
更新機構屬性 API。
例如:
curl -u email:password -X POST -H "Content-type:application/xml" http://api.enterprise.apigee.com/v1/organizations/myorg -d \ "<Organization type="trial" name="MyOrganization"> <Properties> <Property name="features.isHTTPStatusTooManyRequestEnabled">true</Property> . . . </Properties> </Organization>"
結構定義
每種政策類型都是由 XML 架構 (.xsd
) 定義。供參考政策結構定義
GitHub 提供許多資源。
相關主題
- 配額政策:配額 政策,限制個別用戶端的流量
- 頻率限制:頻率限制 總覽
- 比較 配額和 SpikeArrest 政策
- API Proxy 的工作範例