1 熔断原理
熔断器像“保险丝”一样,它作为一个开关,遇到下游服务有问题时,可以打开熔断器断开服务;服务恢复后,又可以关闭熔断器,重新调用服务。它的作用主要有以下两点:
- 当所依赖的服务不稳定时,能够起到快速失败的目的。
- 快速失败后,能够用一定的算法动态探测所依赖对象是否恢复。
熔断器实现主要是设置一个阙值,这个阙值可以是最大并发数或请求错误率百分比,超过这个阙值就进行熔断。还会设置一个尝试恢复时间。
熔断器有3种状态:
- CLOSED:默认状态。熔断器计算数(最大请求数、请求错误百分比等)没有达到设置的阙值,熔断器就认为被代理服务状态良好。
- OPEN:熔断器计算数计算数(最大请求数、请求错误百分比等)已经达到阙值,熔断器就认为被代理的服务已经故障了,打开熔断器开关,请求不再代理服务,而是快速失败。
- HALF OPEN:熔断器打开后,为了能自动恢复被代理服务的访问,会切换到半开放状态,去尝试请求被代理服务以查看服务故障是否已经恢复了。如果恢复了,会转为 CLOSED 状态;否则转到 OPEN 状态。
2 具体使用
2.1 Go 语言开发的熔断框架
2.2 hystrix配置参数说明
hystrix.ConfigureCommand(RedisCommand, hystrix.CommandConfig{
Timeout: 3000, // 执行命令的超时时间
MaxConcurrentRequests: 1000000, // 允许的最大并发请求数
ErrorPercentThreshold: 80, // 错误率阈值,当错误率达到这个值,熔断器打开
SleepWindow: 5000, // 重试间隔
RequestVolumeThreshold: 100, // 请求阈值 每10秒
})
Timeout:
执行的命令超过此设置时间,则直接跳过。
MaxConcurrentRequests、ErrorPercentThreshold、RequestVolumeThreshold:
是否熔断的判断条件主要为以下两点:
- 10秒内达到RequestVolumeThreshold这个请求数,则开始检测,并且如果错误比例达到ErrorPercentThreshold则熔断。
- 如果请求数并发数大于MaxConcurrentRequests则熔断。
SleepWindow:
当熔断器打开后,每经过SleepWindow的时间,熔断器会进入HALF OPEN状态,去尝试请求被代理服务以查看服务故障是否已经恢复了。如果恢复了,会转为 CLOSED 状态;否则转到 OPEN 状态。