微服务如何保证不会出现连锁反应?Go 实现的断路器了解下( 二 )
circuit.Circuittype Circuit struct {//circuitStatsCmdMetricCollectorRunMetricsCollection// 统计调用出现的各种情况FallbackMetricCollector FallbackMetricsCollection// 统计降级调用出现的各种情况CircuitMetricsCollector MetricsCollection// 统计Circuit状态切换的情况// This is used to help run `Go` calls in the backgroundgoroutineWrapper goroutineWrapper // 用于异步调用的封装namestring// 断路器唯一命名的标识notThreadSafeConfig Config // 非线程安全的断路器配置notThreadSafeConfigMu sync.MutexthreadSafeConfigatomicCircuitConfig // 线程安全的断路器配置// Tracks if the circuit has been shut open or closedisOpen faststats.AtomicBoolean // 断路器只有“打开”和“关闭”两种状态// Tracks how many commands are currently runningconcurrentCommands faststats.AtomicInt64// 统计有多少并发调用// Tracks how many fallbacks are currently runningconcurrentFallbacks faststats.AtomicInt64// 统计有多少降级的并发调用// ClosedToOpen controls when to open a closed circuitClosedToOpen ClosedToOpen// 控制断路器由“关闭”状态切换到“打开”状态// openToClosed controls when to close an open circuitOpenToClose OpenToClosed// 控制断路器由“打开”状态切换到“关闭”状态timeNow func() time.Time// 对time.Now的封装 , 值始终为config.General.TimeKeeper.Now , 从config.TimeKeeper的解释看是为了方便测试 , 当没在测试代码里有看到使用}
circuit.ClosedToOpentype ClosedToOpen interface {RunMetrics// 统计调用出现的各种情况Metrics// 统计状态切换的情况// 当出现ErrFailure和ErrTimeout的失败调用时 , 会调用ShouldOpen , ShouldOpen会根据RunMetrics信息决定是否切换到“打开”状态ShouldOpen(now time.Time) bool// 即使断路器处于“关闭”状态 , 也希望能阻止调用Prevent(now time.Time) bool}
【微服务如何保证不会出现连锁反应?Go 实现的断路器了解下】circuit/v3/closers/hystrix/opener.go 是 hystrix 的默认实现 , 实现了 circuit.ClosedToOpen 接口 。
type Opener struct {errorsCountfaststats.RollingCounter // 统计调用出现的ErrFailure和ErrTimeout的情况legitimateAttemptsCount faststats.RollingCounter // 统计调用出现的ErrFailure和ErrTimeout , 以及Success的情况errorPercentagefaststats.AtomicInt64 // 错误阈值requestVolumeThreshold faststats.AtomicInt64 // 如果在一段时间窗口内的调用次数小于该阈值 , 则不会将断路器切换到“打开”状态musync.Mutex // 修改config时的互斥锁config ConfigureOpener}// faststats.RollingCounter 是滑动窗口计数器 , 用于统计一段时间窗口内 , 对每个时间片上发生的事件进行计数
circuit.OpenToClosedtype OpenToClosed interface {RunMetrics// 统计调用出现的各种情况Metrics// 统计状态切换的情况// 当调用成功时 , 会调用ShouldClose , ShouldClose会根据RunMetrics信息决定是否切换到“关闭”状态ShouldClose(now time.Time) bool// “半打开”状态的实现 , 用于在断路器处于“打开”状态时 , 允许部分调用执行Allow(now time.Time) bool}
circuit/v3/closers/hystrix/closer.go 是 hystrix 的默认实现 , 实现了 circuit.OpenToClosed 接口 。
type Closer struct {// 当断路器处于“打开”状态时 , 定时放行部分调用 , 被OpenToClosed.Allow调用reopenCircuitCheck faststats.TimedCheckconcurrentSuccessfulAttempts faststats.AtomicInt64 // 当调用为Success时 , 加1 , 当调用为ErrFailure、ErrTimeout时 , 重置为0closeOnCurrentCountfaststats.AtomicInt64 // 切换到“关闭”状态的阈值 , 在OpenToClosed.ShouldClose中使用musync.Mutex // 修改config时的互斥锁config ConfigureCloser}
推荐阅读
- 亚马逊终止托管服务:Parler网站下线
- 大一非计算机专业的学生,如何利用寒假自学C语言
- Git服务器配置错误导致日产汽车源码在网上泄露
- 虾米音乐,下个月正式停止服务
- 虾米音乐播放器将于2月5日停止服务,今开启用户资产处理通道
- 服务|虾米音乐:2月5日关停3月5日后将无法登录
- 天猫精灵App全新升级,推出“精灵家”服务
- 快递员拒绝送货上门并大喊大叫!经济学者马光远吐槽德邦快递服务烂:流氓至此,坚决抵制
- 亚马逊宣布停止为Parler提供托管服务
- 亚马逊员工权益组织呼吁AWS拒绝为Parler提供托管服务