SpikeArrest 政策

查看 Apigee Edge 說明文件。
前往 Apigee X說明文件
資訊

Edge UI 的衝刺賽圖示

使用 <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>

This element has the following attributes that are common to all policies:

Attribute Default Required? Description
name N/A Required

The internal name of the policy. The value of the name attribute can contain letters, numbers, spaces, hyphens, underscores, and periods. This value cannot exceed 255 characters.

Optionally, use the <DisplayName> element to label the policy in the management UI proxy editor with a different, natural-language name.

continueOnError false Optional Set to "false" to return an error when a policy fails. This is expected behavior for most policies. Set to "true" to have flow execution continue even after a policy fails.
enabled true Optional Set to "true" to enforce the policy. Set to "false" to "turn off" the policy. The policy will not be enforced even if it remains attached to a flow.
async   false Deprecated This attribute is deprecated.

範例

以下範例說明使用「暴雨逮捕」政策的部分方式:

範例 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>

流程變數的值必須採用 intpmintps

如要嘗試這個範例,請執行下列要求:

curl http://myorg-myenv.apigee.net/price -H 'runtime_rate:30ps'

子元素參照

本節將說明 <SpikeArrest> 的子元素。

<DisplayName>

除了 name 屬性之外,您也可以在管理 UI 代理程式編輯器中使用其他更自然的名稱標記政策。

<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 政策

如果您同時定義 ref這個元素的主體, 套用 ref 的值,並在資料流變數發生時優先採用 使用物件規則(如果 ref 中找出的變數,則反轉為 true 要求中「未」設定)。

例如:

<Rate ref="request.header.custom_rate">1pm</Rate>

在本例中,如果用戶端「未」傳送「custom_rate」然後是標頭 所有用戶端的 API Proxy 頻率為每分鐘 1 個要求。如果用戶端將 「custom_rate」標頭,那麼針對 Proxy 存取,直到回應不含「custom_rate」的要求標頭。

您可以使用 <Identifier> 將要求分組,強制針對以下項目套用自訂費率: 不同類型的用戶端

如果您指定 ref 的值,但未在 <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 布林值 唯讀 指出政策是否失敗 (truefalse)。

詳情請參閱流程變數參考資料

錯誤參考資料

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

執行階段錯誤

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

錯誤程式碼 HTTP 狀態 原因 修正
policies.ratelimit.FailedToResolveSpikeArrestRate 500 如果參照包含費率設定的變數,就會發生這個錯誤 無法將 <Rate> 元素中的值解析為尖峰時段中的某個值 政策。此為必要元素,可用來指定 格式為 intpmintps
policies.ratelimit.InvalidMessageWeight 500 如果透過以下其中一種方式為 <MessageWeight> 元素指定值,就會發生這項錯誤。 流量變數無效 (非整數值)。
policies.ratelimit.SpikeArrestViolation 429

超過頻率限制。

部署錯誤

當您部署含有這項政策的 Proxy 時,可能會發生這些錯誤。

錯誤名稱 原因 修正
InvalidAllowedRate 如果在尖峰峰頂攻擊的 <Rate> 元素中指定峰值逮捕率 政策不是整數。如果費率沒有「ps」或「pm」做為後置字串, 那麼 API Proxy 的部署作業就會失敗

錯誤變數

系統會在發生執行階段錯誤時設定這些變數。詳情請參閱重要須知 政策錯誤。

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

錯誤回應範例

錯誤回應範例如下:

{  
   "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 提供許多資源。

相關主題