Polly 超时策略说明
Polly timeout policy clarification
我正在尝试使超时策略正常工作。
我在集成 api.
时有以下要求
- 创建一个 http 请求来调用 endpoint1 并传递 transactionID 并捕获结果
- 如果 http 请求在 20 秒内没有响应,则发送具有相同 transactionID 的取消请求并捕获结果
对于此任务,我想使用 Polly,在我看来,它是帮助处理瞬态故障的绝佳组件。然而,由于我对这项技术还很陌生,所以我只想确定我是否正确实施。
首先我创建了一个像这样的 Polly 超时策略
var timeoutPolicy =
Policy.TimeoutAsync(
TimeSpan.FromSeconds( 20 ),
TimeoutStrategy.Optimistic,
async ( context, timespan, task ) => {
//write here the cancel request
} );
然后我准备执行政策
var policyResult = await timeoutPolicy.ExecuteAndCaptureAsync( async () => {
//make here the request 1
} );
我从文档中得到的是,如果在 timeoutPolicy.ExecuteAndCaptureAsync
委托中发生超时,Polly 会自动调用 onTimeout
委托。对吗?
但是我的问题是:
- 如果在执行委托中发生异常会怎样?我应该将那个 polly 结构包装在一个 try catch 中吗?
- 当我分析策略结果时,如何了解是否发生超时?
What I got from the documentation is that if a timeout occurs inside the
ExecuteAndCaptureAsync delegate Polly automagically invoke the
onTimeout delegate. Right?
What happens if inside the execute delegate an exception occurs?
因为您正在使用 ExecuteAndCaptureAsync(...),所以异常是 placed in policyResult.FinalException。
Should I wrap that polly construct in a try catch?
因为你使用的是 ExecuteAndCaptureAsync(..),所以异常放在 policyResult.FinalException,所以你不需要 try-catch。
When I analyze the policy result how do I understand if the timeout has happened or not?
TimeoutPolicy throws TimeoutRejectedException 超时。因为您使用的是 ExecuteAndCaptureAsync(...),所以您应该会发现该异常位于 policyResult.FinalException.
一些进一步的评论。使用 TimeoutStrategy.Optimisitic
,即 based on co-operative cancellation by CancellationToken
,您应该执行一个接受取消令牌的委托:
var policyResult = await timeoutPolicy.ExecuteAndCaptureAsync(async (ct) => {
//make request 1, in a form which responds to the cancellation token ct
}, userCancellationToken /* CancellationToken.None is acceptable. Polly will merge its timing-out CancellationToken into ct, during policy execution. */
);
其次,作为在 onRetryAsync: async ( context, timespan, task ) => { ... }
中调用取消请求的替代方法,您可以选择使用如下模式使代码更连续/更少嵌套:
var policyResult = await timeoutPolicy.ExecuteAndCaptureAsync(async (ct) => {
//make request 1, in a form which responds to the cancellation token ct
}, CancellationToken.None);
if (policyResult.Outcome == OutcomeType.Failure && policyResult.FinalException is TimeoutRejectedException)
{
//write here the cancel request
}
更新:调用取消请求将以任何一种方式工作 - 从 onRetryAsync
内部或按顺序,就像上面一样。顺序版本的一个优点是它可以更容易地推断如果 取消请求 因异常而失败时会发生什么。使用嵌套方法(在 onRetryAsync
中调用取消请求),最终捕获到 policyResult.FinalException
中的异常可能来自初始请求或取消请求 - 可能很难分辨是哪个。
我正在尝试使超时策略正常工作。 我在集成 api.
时有以下要求- 创建一个 http 请求来调用 endpoint1 并传递 transactionID 并捕获结果
- 如果 http 请求在 20 秒内没有响应,则发送具有相同 transactionID 的取消请求并捕获结果
对于此任务,我想使用 Polly,在我看来,它是帮助处理瞬态故障的绝佳组件。然而,由于我对这项技术还很陌生,所以我只想确定我是否正确实施。
首先我创建了一个像这样的 Polly 超时策略
var timeoutPolicy =
Policy.TimeoutAsync(
TimeSpan.FromSeconds( 20 ),
TimeoutStrategy.Optimistic,
async ( context, timespan, task ) => {
//write here the cancel request
} );
然后我准备执行政策
var policyResult = await timeoutPolicy.ExecuteAndCaptureAsync( async () => {
//make here the request 1
} );
我从文档中得到的是,如果在 timeoutPolicy.ExecuteAndCaptureAsync
委托中发生超时,Polly 会自动调用 onTimeout
委托。对吗?
但是我的问题是:
- 如果在执行委托中发生异常会怎样?我应该将那个 polly 结构包装在一个 try catch 中吗?
- 当我分析策略结果时,如何了解是否发生超时?
What I got from the documentation is that if a timeout occurs inside the ExecuteAndCaptureAsync delegate Polly automagically invoke the onTimeout delegate. Right?
What happens if inside the execute delegate an exception occurs?
因为您正在使用 ExecuteAndCaptureAsync(...),所以异常是 placed in policyResult.FinalException。
Should I wrap that polly construct in a try catch?
因为你使用的是 ExecuteAndCaptureAsync(..),所以异常放在 policyResult.FinalException,所以你不需要 try-catch。
When I analyze the policy result how do I understand if the timeout has happened or not?
TimeoutPolicy throws TimeoutRejectedException 超时。因为您使用的是 ExecuteAndCaptureAsync(...),所以您应该会发现该异常位于 policyResult.FinalException.
一些进一步的评论。使用 TimeoutStrategy.Optimisitic
,即 based on co-operative cancellation by CancellationToken
,您应该执行一个接受取消令牌的委托:
var policyResult = await timeoutPolicy.ExecuteAndCaptureAsync(async (ct) => {
//make request 1, in a form which responds to the cancellation token ct
}, userCancellationToken /* CancellationToken.None is acceptable. Polly will merge its timing-out CancellationToken into ct, during policy execution. */
);
其次,作为在 onRetryAsync: async ( context, timespan, task ) => { ... }
中调用取消请求的替代方法,您可以选择使用如下模式使代码更连续/更少嵌套:
var policyResult = await timeoutPolicy.ExecuteAndCaptureAsync(async (ct) => {
//make request 1, in a form which responds to the cancellation token ct
}, CancellationToken.None);
if (policyResult.Outcome == OutcomeType.Failure && policyResult.FinalException is TimeoutRejectedException)
{
//write here the cancel request
}
更新:调用取消请求将以任何一种方式工作 - 从 onRetryAsync
内部或按顺序,就像上面一样。顺序版本的一个优点是它可以更容易地推断如果 取消请求 因异常而失败时会发生什么。使用嵌套方法(在 onRetryAsync
中调用取消请求),最终捕获到 policyResult.FinalException
中的异常可能来自初始请求或取消请求 - 可能很难分辨是哪个。