标签:初始化 led obj hub src rev tsp policy state
熔断策略主要以 CircuitBreaker 来完成、
熔断器可以被看作为一个主要含有三个状态的状态机
如果以电路开关来看:
开关闭合对应 CLOSED 状态, 开关打开对应 OPEN 状态, 而 HALF OPEN 只是为了过渡处理过程中的状态变化
熔断器的初始状态就是 CLOSED, 当熔断器状态为 CLOSED 的时候:
当熔断器状态为 OPEN 的时候:
BrokenCircuitException
异常
BrokenCircuitException
将包含最后试熔断器状态改变操作抛出的异常作为 InnerException
durationOfBreak
参数配置的时间。在此时间结束之后,当下一个经过策略的操作执行或者当
CircuitState
熔断器状态被查询的时候, 熔断器的状态会变更为 HALF OPEN。当熔断器状态为 HALF OPEN 的时候:
durationOfBreak
设置的熔断时间,则执行操作。熔断器在每次熔断的期间内 durationOfBreak
,只允许有一次尝试操作。所有其他在 HALF OPEN 状态的操作都会被拒绝执行,并抛出 BrokenCircuitException
。Execute()
(或类似重载) 的委托方法将被尝试调用
durationOfBreak
配置的时间。public static void TryBasic()
{
var breaker = Policy
// 设置熔断器处理的异常类型
.Handle<Exception>()
// 设置异常阈值 3 ,熔断持续时间 5.5 秒
.CircuitBreaker(3, TimeSpan.FromSeconds(5.5),
(e, state, tspan, context)=>
{
Console.WriteLine($"OnBreak: state: {state} \r\n ex: {e.Message}");
},
context =>
{
Console.WriteLine("onReset");
},
()=>
{
Console.WriteLine("onHalfOpen");
});
var random = new Random();
var obj = Policy<object>
.Handle<Exception>()
.WaitAndRetryForever(
(times, tspan) => TimeSpan.FromSeconds(1),
(res, times, tspan, c) =>
{
Console.WriteLine($"retry: {times}, breaker state: {breaker.CircuitState}");
})
// 组合重试与熔断策略
.Wrap(breaker)
.Execute(() =>
{
var val = random.Next(1, 100);
Console.WriteLine($"called:{val}");
switch (val % 9)
{
case 0:
return "Success";
default:
throw new Exception($"error val: {val}");
}
});
Console.WriteLine(obj);
}
输出:
熔断器初始化状态为 CLOSED, 在产生三次异常之后,触发 OnBreak
回调, 状态也变更为了 OPEN,
在上面我们设置的熔断持续时间结束后,状态变更为了 HALF OPEN, 由重试策略执行了一次 Execute
,
called: 20
因为由引发了一次异常,导致 CircuitBreaker
再次熔断, 状态变更为 OPEN,与流程图一致。
public static void TryAdvanced()
{
var breaker = Policy
.Handle<Exception>()
// 设置高级熔断器
.AdvancedCircuitBreaker(
// 设置超过30%的失败率则熔断
failureThreshold: 0.8,
// 10 秒做一次采样
samplingDuration: TimeSpan.FromSeconds(10),
// 在采样时间内最小吞吐量
minimumThroughput: 5,
// 熔断持续时间
durationOfBreak: TimeSpan.FromSeconds(10),
onBreak: (e, state, tspan, context) =>
{
Console.WriteLine($"OnBreak: state: {state} \r\n ex: {e.Message}");
},
onReset: context =>
{
Console.WriteLine("onReset");
},
onHalfOpen: () =>
{
Console.WriteLine("onHalfOpen");
});
var random = new Random();
var obj = Policy<object>
.Handle<Exception>()
.WaitAndRetryForever(
(times, tspan) => TimeSpan.FromSeconds(1),
(res, times, tspan, c) =>
{
Console.WriteLine($"retry: {times}, breaker state: {breaker.CircuitState}");
})
.Wrap(breaker)
.Execute(() =>
{
var val = random.Next(1, 100);
Console.WriteLine($"called:{val}");
switch (val % 9)
{
case 0:
return "Success";
default:
throw new Exception($"error val: {val}");
}
});
Console.WriteLine(obj);
}
输出:
将采样时间内 samplingDuration
异常次数除以设置最小吞吐量 minimumThroughput
,得到失败率,若超过设置的 failureThreshold
,则触发熔断。
使用 Wrap
方法组合两个或 更多策略一起监控 Execute
中执行的操作。
标签:初始化 led obj hub src rev tsp policy state
原文地址:https://www.cnblogs.com/rajesh/p/10775598.html