重試
適用於:所有 APIM 層
retry
原則會執行其子原則一次,然後重試子原則的執行,直到重試 condition
變成 false
或重試 count
用盡。
注意
請依照原則陳述式中提供的順序,來設定原則的元素和子元素。 深入了解如何設定或編輯 APIM 原則。
原則陳述式
<retry
condition="Boolean expression or literal"
count="number of retry attempts"
interval="retry interval in seconds"
max-interval="maximum retry interval in seconds"
delta="retry interval delta in seconds"
first-fast-retry="boolean expression or literal">
<!-- One or more child policies. No restrictions. -->
</retry>
屬性
屬性 | 描述 | 是必要欄位 | 預設 |
---|---|---|---|
條件 | 布林值。 指定重試應該停止 (false ) 還是繼續 (true )。 允許原則運算式。 |
Yes | N/A |
計數 | 1 與 50 之間的正數,指定要嘗試重試的次數上限。 允許原則運算式。 | Yes | N/A |
interval | 以秒為單位的正數,指定重試嘗試之間的等待間隔。 允許原則運算式。 | Yes | N/A |
max-interval | 以秒為單位的正數,指定重試嘗試之間的最大等待間隔。 此屬性可用來實作指數重試演算法。 允許原則運算式。 | No | N/A |
delta | 以秒為單位的正數,指定等待間隔的增量。 此屬性可用來實作線性和指數的重試演算法。 允許原則運算式。 | No | N/A |
first-fast-retry | 布林值。 如果設定為 true ,則會立即執行第一個重試嘗試。 允許原則運算式。 |
No | false |
重試等候時間
當只有指定
interval
時,會執行固定間隔的重試。只有指定
interval
和delta
,才能使用線性間隔重試演算法。 重試之間的等候時間會根據下列公式增加:interval + (count - 1)*delta
。指定
interval
、max-interval
和delta
時,會套用指數間隔重試演算法。 重試間的等候時間會根據下列公式以指數方式增加:interval + (2^(count - 1)) * random(delta * 0.8, delta * 1.2)
,最大間隔由max-interval
設定。例如,當
interval
和delta
都設定為 10 秒,而max-interval
是 100 秒,重試之間的大約等候時間會以下列方式增加:10 秒、20 秒、40 秒、80 秒,剩餘重試使用 100 秒的等候時間。
元素
retry
原則可能會包含其他任何原則,以作為其子元素。
使用方式
範例
使用指數重試的要求轉送
下列範例會使用指數重試演算法來重試要求轉送最多十次。 因為 first-fast-retry
設定為 false
,所以所有重試嘗試都會受限於在以指數方式增加的重試等候時間 (此範例中大約為 10 秒、20 秒、40 秒...),最長等候時間為 max-interval
。
<retry
condition="@(context.Response.StatusCode == 500)"
count="10"
interval="10"
max-interval="100"
delta="10"
first-fast-retry="false">
<forward-request buffer-request-body="true" />
</retry>
初始要求失敗時傳送要求
在下列範例中,如果連線遭到解除/逾時,或要求導致伺服器端錯誤,則會重試傳送要求到定義後端以外的 URL,最多重試三次。 由於 first-fast-retry
設定為 true,因此第一次重試會在初始要求失敗後立即執行。 請注意,send-request
必須設定 ignore-error
為 true,才能 response-variable-name
在發生錯誤時為 Null。
<retry
condition="@(context.Variables["response"] == null || ((IResponse)context.Variables["response"]).StatusCode >= 500)"
count="3"
interval="1"
first-fast-retry="true">
<send-request
mode="new"
response-variable-name="response"
timeout="3"
ignore-error="true">
<set-url>https://api.contoso.com/products/5</set-url>
<set-method>GET</set-method>
</send-request>
</retry>
相關原則
相關內容
如需使用原則的詳細資訊,請參閱:
- 教學課程:轉換及保護 API
- 原則參考,取得原則陳述式及其設定的完整清單
- 原則運算式
- 設定或編輯原則
- 重複使用原則設定
- 原則程式碼片段存放庫 (英文)
- Azure API 管理 原則工具組
- 使用 Microsoft Azure Copilot 撰寫原則