- RequestVolumeThreshold 指明某个command在多少次调用之后开始探测熔断
- SleepWindow 指明在熔断发生后何时开始探测其是否恢复,单位毫秒
- Timeout 指明command的执行超时时间,单位毫秒
- ErrorPercentThreshold 指明熔断的触发条件:失败调用占总调用次数的比例
- MaxConcurrentRequests 指明最大并发数,很好理解了
服务器的熔断机制是个大话题,可以参考这篇文章一窥究竟:熔断,限流,降级。
Netflix的熔断系统Hystrix很有效,并提供了golang的包:https://github.com/afex/hystrix-go。来看看参数如何使用,代码中的默认配置定义为:
RequestVolumeThreshold 指明某个command在多少次调用之后开始探测熔断
如上,RequestVolumeThreshold 为1,则第二次调用开始探测,由于所有调用全部失败,则熔断立马被触发,后续调用全部不能触达query
函数。
2019/05/09 15:15:15 testHystrix error:bad luck
2019/05/09 15:15:15 hystrix-go: opening circuit seckill
2019/05/09 15:15:15 testHystrix error:hystrix: circuit open
2019/05/09 15:15:15 testHystrix error:hystrix: circuit open
2019/05/09 15:15:15 testHystrix error:hystrix: circuit open
2019/05/09 15:15:15 testHystrix error:hystrix: circuit open
2019/05/09 15:15:15 testHystrix error:hystrix: circuit open
2019/05/09 15:15:15 testHystrix error:hystrix: circuit open
2019/05/09 15:15:15 testHystrix error:hystrix: circuit open
2019/05/09 15:15:15 testHystrix error:hystrix: circuit open
2019/05/09 15:15:15 testHystrix error:hystrix: circuit open
2019/05/09 16:02:56 Gcount:1 Gerror:1
Process finished with exit code 0
最后的结果为调用了一次,失败一次。
SleepWindow 指明在熔断发生后何时开始探测其是否恢复,单位毫秒
修改参数为:
熔断发生后1毫秒后就开始探测是否恢复,当然结果还是继续失败:
2019/05/09 16:36:21 testHystrix error:bad luck
2019/05/09 16:36:21 hystrix-go: opening circuit seckill
2019/05/09 16:36:21 testHystrix error:hystrix: circuit open
2019/05/09 16:36:21 testHystrix error:hystrix: circuit open
2019/05/09 16:36:21 testHystrix error:hystrix: circuit open
2019/05/09 16:36:21 testHystrix error:hystrix: circuit open
2019/05/09 16:36:21 testHystrix error:hystrix: circuit open
2019/05/09 16:36:21 testHystrix error:hystrix: circuit open
2019/05/09 16:36:21 testHystrix error:hystrix: circuit open
2019/05/09 16:36:21 testHystrix error:hystrix: circuit open
2019/05/09 16:36:21 hystrix-go: allowing single test to possibly close circuit seckill
2019/05/09 16:36:21 testHystrix error:hystrix: timeout
2019/05/09 16:36:21 Gcount:2 Gerror:2
Process finished with exit code 0
最后的结果为调用了两次,失败两次。
Timeout 指明command的执行超时时间,单位毫秒
参数为原始参数。修改query
函数:
所有调用都超时,结果为调用了一次,失败0次。
2019/05/09 16:49:43 testHystrix error:hystrix: timeout
2019/05/09 16:49:43 hystrix-go: opening circuit seckill
2019/05/09 16:49:43 testHystrix error:hystrix: circuit open
2019/05/09 16:49:43 testHystrix error:hystrix: circuit open
2019/05/09 16:49:43 testHystrix error:hystrix: circuit open
2019/05/09 16:49:43 testHystrix error:hystrix: circuit open
2019/05/09 16:49:43 testHystrix error:hystrix: circuit open
2019/05/09 16:49:43 testHystrix error:hystrix: circuit open
2019/05/09 16:49:43 testHystrix error:hystrix: circuit open
2019/05/09 16:49:43 testHystrix error:hystrix: circuit open
2019/05/09 16:49:43 testHystrix error:hystrix: circuit open
2019/05/09 16:49:43 Gcount:1 Gerror:0
Process finished with exit code 0
ErrorPercentThreshold 指明熔断的触发条件:失败调用占总调用次数的比例
参数为原始参数。修改query
函数:
测试100次,结果太长不贴了,核心就是失败次数占总次数的比例,触发熔断之后清空,待恢复之后重新计算。