spring cloud hytrix熔断策略详解

Hytrix看起来很简单,貌似使用默认配置就行,但实际使用起来坑多多,稍不留意,就会入坑。

一 线程池

coresize

比如这个coresize,默认是10,平常看起来是ok的,但一旦面临高并发,就会爆掉

clipboard.png

如图所示,用户请求都会被包装成一个hytrix请求,hytrix使用ThreadPoolExecutor来管理线程池,一旦超限,就会爆掉
比如有30个rps,平均每个请求响应时间为0.2s,那么需要的线程数就是30*0.2=6,然后加上一个附加值,比如说4,6+4=10
如果是100rqs,每个响应时间0.2, 100*0.2=20,那就是至少20个线程。当然,此时请求平均响应时间应该会延长,应该根据实际情况计算。

按照文档说设置这个值过大会影响性能,但个人以为设置成100并不会有何问题。

maximumSize

有了coresize当然有maximumsize了,一般coresize = maximumsize,只有当你设置allowMaximumSizeToDivergeFromCoreSize=true时才起作用

maxQueueSize

线程池的队列配置,如果线程超过线程池大小coresize,会进入该队列排队。默认是-1,就是SynchronousQueue,如果设置为正值,会使用LinkedBlockingQueue。该配置不可修改,如果修改,必须要重启应用才会生效。

queueSizeRejectionThreshold

队列的拒绝门槛。即使在队列中排队的线程未达到最大值,只要超过了这个阀值,请求线程都会被丢弃掉,所以maxQueueSize某种意义是没用的

keepAliveTimeMinutes

线程在队列中的存活事件,默认值是1(应该是1s),需要allowMaximumSizeToDivergeFromCoreSize=true

allowMaximumSizeToDivergeFromCoreSize

设置maximumSize和keepAliveTimeMinutes是否起作用,默认是false,就是不起作用

二 滑动窗口与阀值微调

大家都知道断路器会跳闸,但到底是如何跳闸呢?是失败多少次么?那么是不是还需要一个时间值,来判断多长时间失败多少次。有点类似于一个滑动窗口:

clipboard.png

  1. Hystrix遇到服务错误时,会开启一个10s的窗口
  2. 如果在该窗口内错误调用未达到阀值,那么程序继续
  3. 如果达到阀值,那么断路器会跳闸
  4. 跳闸的同时,会启动一个新的活动窗口5s
  5. 在5s的窗口期间会尝试将一个请求发到对方服务
  6. 如果失败,继续保持断路状态
  7. 如果成功,重启10s的滑动窗口

]

@HystrixCommand(
    fallbackMethod = "buildFallbackLicenseList",
    threadPoolKey = "licenseByOrgThreadPool",
    threadPoolProperties = {
        @HystrixProperty(name = "coreSize", value="30"),
        @HystrixProperty(name = "maxQueueSize" value="10"),
    },
    commandPoolProperties = {
        @HystrixProperty(name="circuitBreaker.requestVolumeThreshold", value="10"),
        @HystrixProperty(name="circuitBreaker.errorThresholdPercentage", value="75"),
        @HystrixProperty(name="circuitBreaker.sleepWindowInMilliseconds", value="7000"),
        @HystrixProperty(name="metrics.rollingStats.timeInMilliseconds", value="15000"),
        @HystrixProperty(name="metrics.rollingStats.numBuckets", value="5")
    }
)
public String doSth(){....}

各参数说明如下:

circuitBreaker.requestVolumeThreshold

表示在10s中必须发生的连续调用次数阀值。比如这个值是20,那么及时在10s的时间窗口中全部19个请求失败了,也不会触发熔断。

circuitBreaker.errorThresholdPercentage

错误阀值,超过这个阀值会触发熔断,所有的请求都会打到fallback上

circuitBreaker.sleepWindowInMilliseconds

发生熔断后,熔断器会睡眠多长时间后,才会再次尝试访问对方服务

metrics.rollingStats.timeInMilliseconds

窗口大小,默认10s

metrics.rollingStats.numBuckets

桶的个数,必须被timeInMilliseconds整除。比如numBuckets=2,那么 timeInMilliseconds/numBuckets = 5,就是在5秒内Hystrix展开监控


大杂烩
所学甚杂

教育皆祸害,[链接]

2k 声望
221 粉丝
0 条评论
推荐阅读
人工智能/大数据就业前景及优劣势分析
总述 职位少,要求高,人工智能落地困难,决定了就业可能会是一个大问题 全国范围内的人工智能的职位是183 而Java是10000+ (因lagou并不展示总数,因此该数据从请求分析而来) 因此岗位数量与Java大概是60倍的差距...

方老司1阅读 5.6k

Spring 系列框架的中文文档
现在互联网上的 Spring 框架相关的中文文档基本上都是机器翻译,内容晦涩难懂且常年未更新。例如,像 spring-security 等这种概念繁多,体系复杂的技术,对于新手来说,没有优质的技术文档基本上是寸步难行。所以...

KevinBlandy阅读 589

监控系统选型,一篇全搞定!
这篇文章,我将对监控体系的基础知识、原理和架构做一次系统性整理,同时还会对几款最常用的开源监控产品做下介绍,以便大家选型时参考。内容包括3部分:

码猿技术专栏阅读 403

open feign 调用超时与重试
在 spring cloud 各种组件中,我最早接触的就是 open feign,但从来没有讲过它。原因是因为觉得它简单,无非就是个服务调用,在代码层面上也很简单,没有啥可说的。

KerryWu阅读 302

深入剖析 Spring Boot 的 SPI 机制
SPI(Service Provider Interface)是JDK内置的一种服务提供发现机制,可以用来启用框架扩展和替换组件,主要用于框架中开发,例如Dubbo、Spring、Common-Logging,JDBC等采用采用SPI机制,针对同一接口采用不同的实...

码猿技术专栏阅读 300

网易二面:CPU狂飙900%,该怎么处理?
大家好,我是不才陈某~[星球]()一位小伙伴面试了 网易,遇到了一个 性能类的面试题:CPU飙升900%,该怎么处理?可惜的是,以上的问题,这个小伙没有回答理想。最终,导致他网易之路,终止在二面,非常可惜关注公...

码猿技术专栏阅读 259

100Wqps短链系统,怎么设计?
这段时间,在整理知识星球中面试专栏时看到这么一个字节跳动的二面真题:100Wqps短链系统,怎么设计?这道题,看上去业务简单,其实,覆盖的知识点非常多:高并发、高性能分布式 IDRedis Bloom Filter 高并发、低...

码猿技术专栏阅读 190

教育皆祸害,[链接]

2k 声望
221 粉丝
宣传栏