【发布时间】:2021-10-28 01:40:38
【问题描述】:
我第一次尝试实施断路器,但它不起作用。后备政策有效,但我似乎无法达到断路器。我已经在不同的版本中尝试过这个,包括断路器的重试策略,但这似乎并不重要。我确定这是我错过的基本内容。
这是用于测试目的的代码的简化版本:
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));
【问题讨论】:
-
嗨!当您期望断路器“工作”/“到达”时,您是否能够发布您正在使用的完整代码? (也就是说:你有你希望触发电路中断的代码?或者?)。到目前为止发布的代码只有一个调用
await policy.ExecuteAsync(() => Task.Delay(-1));。只有当_settings.ConsecutiveExceptionsAllowedBeforeBreaking连续调用失败时,电路才会中断。因此,从目前发布的代码来看,只有_settings.ConsecutiveExceptionsAllowedBeforeBreaking == 1时电路才会中断。 -
也可能相关:您在此处定义的
circuitBreaker策略不会吸收TimeoutRejectedException(如果这是您所期望的)。在计算出现次数后,它将重新抛出它。断路器只是一种测量和(如果超过故障阈值)分断装置,但它会重新抛出所有异常。请参阅:github.com/App-vNext/Polly/wiki/… 和 stackoverflow.com/a/37101237。希望这可以帮助。如果不是,您能否定义您期望但未看到的行为? - 你所说的“到达”断路器是什么意思,或者它正在“工作”? -
还有:这是一个dotnetfiddle sample,显示断路器工作。 Polly Samples 编号 6、7 及以后的示例可以从 Visual Studio 或类似工具中运行。
标签: circuit-breaker polly