14

hystrix-go

 5 years ago
source link: https://studygolang.com/articles/13729?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

内部组织了一次关于hystrix-go的分享,没想到引起了内部的困惑,对于没有做过分布式系统的开发同学可能根本没有接触过hystrix,学习一个新东西,我个人的一贯思路是按照黄金圈理论。

y6NfeyV.png!web

这里关于hystrix是什么就不描述了,百度一下足够你翻几屏的了。

因为目前Team以golang为主要开发语言,所以使用了开源的 hystrix-go (https://github.com/afex/hystrix-go).

大家先看下面一个例子:

var Number int

var  Result string

func main() {

config := hystrix.CommandConfig{

Timeout:2000,                        //超时时间设置  单位毫秒

MaxConcurrentRequests:8,            //最大请求数

SleepWindow:1,                      //过多长时间,熔断器再次检测是否开启。单位毫秒

ErrorPercentThreshold:30,            //错误率

RequestVolumeThreshold:5,            //请求阈值  熔断器是否打开首先要满足这个条件;这里的设置表示至少有5个请求才进行ErrorPercentThreshold错误百分比计算

}

hystrix.ConfigureCommand("test",config)

cbs,_,_:= hystrix.GetCircuit("test")

defer hystrix.Flush()

for i:= 0;i < 50 ;i++ {

start1 := time.Now()

Number = i

hystrix.Go("test",run ,getFallBack)

fmt.Println("请求次数:",i +1,";用时:",time.Now().Sub(start1),";请求状态 :",Result,";熔断器开启状态:",cbs.IsOpen(),"请求是否允许:",cbs.AllowRequest())

time.Sleep(1000 * time.Millisecond)

}

time.Sleep(20 * time.Second)

}

func run()error {

Result ="RUNNING1"

if Number >10 {

return nil

}

if Number %2 ==0  {

return nil

} else {

return errors.New("请求失败")

}

}

func getFallBack(errerror) error {

Result ="FALLBACK"

return nil

}

这是一个同事分享时讲的一个列子(不知这个例子的具体出路),也就是这个例子,把大家搞晕了~~。

大家可能会预期输出第一次i == 0,对2取余为0,然后输出

请求次数: 1 ;用时: 12.002µs ; 请求状态 : ; 熔断器开启状态: false 请求是否允许: true

请求次数: 2 ;用时: 131.926µs ;请求状态 : RUNNING1 ;熔断器开启状态: false 请求是否允许: true

然后依次循环,当到第11次时,对2取余不为9的次数为5,到达RequestVolumeThreshold设定的5,所以熔断器开启,此后的处理不会进入到run函数,直到SleepWindow时间到,会开启重试。

然后大家可以运行下上面的程序试试,实际并非如此。这里存在对大家两个知识点的掌握程度考验,1:go协程。2、hystrix-go的配置参数含义理解。

对于知识点1,这里不再做解释了,请查看上一篇文章,https://www.jianshu.com/writer#/notebooks/27310466/notes/30733785。

讲上面的例子稍微修改下,增加runtime.GOMAXPROCS(1),就能够达到上面的预期了吗?然而并没有,如果这里还没有理解,说明大家没有仔细看我上面提到的那个文章,或者说看了没有看透。

那么究竟怎么做才能达到我们心里预期那?

大家细看下hystrix-go源码或readme,实际上hystrix提供了hystrix.Go、hystrix.GoC、hystrix.Do、hystrix.DoC这四种方法。顾名思义,GoX代表异步调用处理,DoX代表同步处理,因此将上面的例子中的hystrix.Go改成hystrix.Do,基本可以输出之前的预期结果,但是细心的人仔细查看输出结果其实并不对。接下来主要讨论下hystrix.CommandConfig{

Timeout:2000,                        //超时时间设置  单位毫秒

MaxConcurrentRequests:8,            //最大请求数

SleepWindow:1,                      //过多长时间,熔断器再次检测是否开启。单位毫秒

ErrorPercentThreshold:30,            //错误率

RequestVolumeThreshold:5,            //请求阈值  熔断器是否打开首先要满足这个条件;这里的设置表示至少有5个请求才进行ErrorPercentThreshold错误百分比计算

}这里的几个参数。

Timeout,顾名思义就是指运行run函数的超时时间,如果超时,熔断器失败次数+1,这里可以将run函数里面增加个大于timeout的延时看看效果?然后在getFallBack函数里面打印下err,会hystrix: timeout这个错误输出。

再说下SleepWindow这个参数。按照上面的例子,会有如下的打印

请求次数: 11 ;用时: 164.183µs ;请求状态 : RUNNING1 ;熔断器开启状态: false 请求是否允许: true

请求次数: 12 ;用时: 117.482µs ;请求状态 : FALLBACK ;熔断器开启状态: true 请求是否允许: false

请求次数: 13 ;用时: 184.445µs ;请求状态 : RUNNING1 ;熔断器开启状态: false 请求是否允许: true

熔断器状态在12个请求开启了一次,立刻关闭了,这就是因为sleepWindow时间很短(1ms),熔断器再次检测ok后,立马改变了熔断器状态。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK