重試

適用於:所有 API 管理 層

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 時,會執行固定間隔的重試。

  • 只有指定 intervaldelta,才能使用線性間隔重試演算法。 重試之間的等候時間會根據下列公式增加: interval + (count - 1)*delta

  • 指定 intervalmax-intervaldelta 時,會套用指數間隔重試演算法。 重試間的等候時間會根據下列公式以指數方式增加: interval + (2^count - 1) * random(delta * 0.8, delta * 1.2),最大間隔由 max-interval 設定。

    例如,當 intervaldelta 都設定為 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>

如需使用原則的詳細資訊,請參閱: