Polly 断路器未被调用
Polly circuitbreaker is not being called
我第一次尝试实现断路器,但它就是行不通。回退政策有效,但我似乎无法触及断路器。我已经在不同的版本中尝试过这个,包括断路器的重试策略,但这似乎并不重要。我确定这是我错过的基本内容。
这里是用于测试目的的代码的简化版本:
var timeoutPolicy = Policy
.TimeoutAsync(
_settings.TimeoutWhenCallingApi,
TimeoutStrategy.Pessimistic
);
var circuitBreaker = Policy
.Handle<TimeoutRejectedException>()
.CircuitBreakerAsync(
_settings.ConsecutiveExceptionsAllowedBeforeBreaking,
_settings.DurationOfBreak
)
.WrapAsync(timeoutPolicy);
policy = Policy
.Handle<Exception>()
.FallbackAsync(
async cancellationToken => { Console.WriteLine("fallback triggered"); })
.WrapAsync(circuitBreaker);
await policy.ExecuteAsync(() => Task.Delay(-1));
以下代码示例构建的超时、断路器和回退策略与您问题中发布的原始代码基本相同。
using Polly;
using System;
using System.Threading.Tasks;
public class Program
{
public static async void Main() {
var timeoutPolicy = Policy
.TimeoutAsync(
TimeSpan.FromMilliseconds(10), // _settings.TimeoutWhenCallingApi,
Polly.Timeout.TimeoutStrategy.Pessimistic
);
var circuitBreaker = Policy
.Handle<Polly.Timeout.TimeoutRejectedException>()
.CircuitBreakerAsync(
1, // _settings.ConsecutiveExceptionsAllowedBeforeBreaking,
TimeSpan.FromSeconds(30) // _settings.DurationOfBreak
);
var circuitBreakerWrappingTimeout = circuitBreaker
.WrapAsync(timeoutPolicy);
var policy = Policy
.Handle<Exception>()
.FallbackAsync(
async cancellationToken => { Console.WriteLine("fallback triggered"); })
.WrapAsync(circuitBreakerWrappingTimeout);
Console.WriteLine("Circuit state before execution: " + circuitBreaker.CircuitState);
await policy.ExecuteAsync(() => Task.Delay(-1));
Console.WriteLine("Circuit state after execution: " + circuitBreaker.CircuitState);
}
}
代码可以是 运行 这个 dotnetfiddle 示例:https://dotnetfiddle.net/m9O3cg
(dotnetfiddle 示例更改为非异步 main 只是因为 dotnetfiddle 并不总是 await
async Main()
方法完成,所以输出并不总是用 async Main()
完成)
输出为:
Circuit state before execution: Closed
fallback triggered
Circuit state after execution: Open
这表明断路器策略正在 reached/taking 您的执行中。
- 执行的委托被超时策略超时,抛出
TimeoutRejectedException
- 断路器策略捕捉到它并计算它经历的连续
TimeoutRejectedException
s 的次数:1. 这足以断开,因此断路器转换为打开状态。
- 断路器重抛
TimeoutRejectedException
(只是测分器)
- 回退策略捕获
TimeoutRejectedException
并输出回退。
- 最后一行输出电路状态表明断路器受到(因此参与)呼叫的影响。
在 30 秒 durationOfBreak
内通过 policy
的另一次执行将失败 BrokenCircuitException
,因为电路处于打开状态。
我第一次尝试实现断路器,但它就是行不通。回退政策有效,但我似乎无法触及断路器。我已经在不同的版本中尝试过这个,包括断路器的重试策略,但这似乎并不重要。我确定这是我错过的基本内容。
这里是用于测试目的的代码的简化版本:
var timeoutPolicy = Policy
.TimeoutAsync(
_settings.TimeoutWhenCallingApi,
TimeoutStrategy.Pessimistic
);
var circuitBreaker = Policy
.Handle<TimeoutRejectedException>()
.CircuitBreakerAsync(
_settings.ConsecutiveExceptionsAllowedBeforeBreaking,
_settings.DurationOfBreak
)
.WrapAsync(timeoutPolicy);
policy = Policy
.Handle<Exception>()
.FallbackAsync(
async cancellationToken => { Console.WriteLine("fallback triggered"); })
.WrapAsync(circuitBreaker);
await policy.ExecuteAsync(() => Task.Delay(-1));
以下代码示例构建的超时、断路器和回退策略与您问题中发布的原始代码基本相同。
using Polly;
using System;
using System.Threading.Tasks;
public class Program
{
public static async void Main() {
var timeoutPolicy = Policy
.TimeoutAsync(
TimeSpan.FromMilliseconds(10), // _settings.TimeoutWhenCallingApi,
Polly.Timeout.TimeoutStrategy.Pessimistic
);
var circuitBreaker = Policy
.Handle<Polly.Timeout.TimeoutRejectedException>()
.CircuitBreakerAsync(
1, // _settings.ConsecutiveExceptionsAllowedBeforeBreaking,
TimeSpan.FromSeconds(30) // _settings.DurationOfBreak
);
var circuitBreakerWrappingTimeout = circuitBreaker
.WrapAsync(timeoutPolicy);
var policy = Policy
.Handle<Exception>()
.FallbackAsync(
async cancellationToken => { Console.WriteLine("fallback triggered"); })
.WrapAsync(circuitBreakerWrappingTimeout);
Console.WriteLine("Circuit state before execution: " + circuitBreaker.CircuitState);
await policy.ExecuteAsync(() => Task.Delay(-1));
Console.WriteLine("Circuit state after execution: " + circuitBreaker.CircuitState);
}
}
代码可以是 运行 这个 dotnetfiddle 示例:https://dotnetfiddle.net/m9O3cg
(dotnetfiddle 示例更改为非异步 main 只是因为 dotnetfiddle 并不总是 await
async Main()
方法完成,所以输出并不总是用 async Main()
完成)
输出为:
Circuit state before execution: Closed
fallback triggered
Circuit state after execution: Open
这表明断路器策略正在 reached/taking 您的执行中。
- 执行的委托被超时策略超时,抛出
TimeoutRejectedException
- 断路器策略捕捉到它并计算它经历的连续
TimeoutRejectedException
s 的次数:1. 这足以断开,因此断路器转换为打开状态。 - 断路器重抛
TimeoutRejectedException
(只是测分器) - 回退策略捕获
TimeoutRejectedException
并输出回退。 - 最后一行输出电路状态表明断路器受到(因此参与)呼叫的影响。
在 30 秒 durationOfBreak
内通过 policy
的另一次执行将失败 BrokenCircuitException
,因为电路处于打开状态。