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.8k

Spring Boot +URule 规则引擎,太顶了!
前段时间,在做项目重构的时候,遇到很多地方需要做很多的条件判断。当然可以用很多的if-else判断去解决,但是当时也不清楚怎么回事,就想玩点别的。于是乎,就去调研了规则引擎。

码猿技术专栏1阅读 275

项目终于用上了xxl-job,真香!
本篇文章主要记录项目中遇到的 xxl-job 的实战,希望能通过这篇文章告诉读者们什么是 xxl-job 以及怎么使用 xxl-job 并分享一个实战案例。

码猿技术专栏1阅读 596

SpringCloud - Hystrix-Dashboard
前言🏃🏃🏃 {代码...} 简介 {代码...} 快速开始生产者-providerMaven依赖 {代码...} application.yml配置 {代码...} 编码feignClient {代码...} fallback {代码...} feignClient 实现类 {代码...} 消费者-consumerMa...

t_什么都没有阅读 880

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

码猿技术专栏阅读 587

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

码猿技术专栏阅读 511

Java微服务云原生想法
现在越来越多人在讨论云原生,也就是使用Kubernetes作为部署架构,完全抽离IASS。其实Java跟云原生并不是这么搭配的,至少Spring Cloud跟Kubernetes 不合的,有很多功能重复的。 Spring Cloud的服务发现、配置中...

神易风阅读 284

教育皆祸害,[链接]

2k 声望
221 粉丝
宣传栏