你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

重试

适用于:所有 API 管理层级

retry 策略会执行其子策略一次,并重新尝试执行,直至重试 condition 变为 false,或者重试 count 为零。

注意

按照策略声明中提供的顺序设置策略的元素和子元素。 详细了解如何设置或编辑 API 管理策略

策略语句

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

属性

属性 说明 需要 默认
condition 布尔值。 指定是应停止重试 (false) 还是继续 (true)。 允许使用策略表达式。 空值
count 一个 1 到 50 之间的正数,指定进行尝试时的重试次数。 允许使用策略表达式。 空值
interval 一个以秒为单位的正数,指定两次重试之间的等待时间。 允许使用策略表达式。 空值
max-interval 一个以秒为单位的正数,指定两次重试之间的最长等待时间, 用于实现指数重试算法。 允许使用策略表达式。 空值
delta 一个以秒为单位的正数,指定等待时间间隔增量, 用于实现线性和指数重试算法。 允许使用策略表达式。 空值
first-fast-retry 布尔值。 如果设置为 true,则会立即执行首次重试。 允许使用策略表达式。 false

重试等待时间

  • 仅指定 interval 时,则会执行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 策略可能包含任何可充当其子元素的其他策略。

使用情况

示例

使用指数重试的请求转发

在以下示例中,请求转发最高可使用指数重试算法重试 10 次。 由于 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>

有关使用策略的详细信息,请参阅: