重试
适用于:所有 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
时间间隔的重试。仅指定
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
策略可能包含任何可充当其子元素的其他策略。
使用情况
示例
使用指数重试的请求转发
在以下示例中,请求转发最高可使用指数重试算法重试 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>
相关策略
后续步骤
有关使用策略的详细信息,请参阅:
- 教程:转换和保护 API
- 策略参考,其中提供了策略语句及其设置的完整列表
- 策略表达式
- 设置或编辑策略
- 策略示例