高可用架构(10)-Hystrix隔离策略、Command及资源池大小控制(下)

简介: 高可用架构(10)-Hystrix隔离策略、Command及资源池大小控制(下)

3 command线程池

ThreadPoolKey代表了一个HystrixThreadPool,用来进行统一监控,统计,缓存

4.png

默认的threadpool key就是command group名称

5.png

每个command都会跟它的ThreadPoolKey对应的ThreadPool绑定

如果不想直接用command group,也可以手动设置thread pool name

public CommandHelloWorld(String name) {
    super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"))
            .andCommandKey(HystrixCommandKey.Factory.asKey("HelloWorld"))
            .andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey("HelloWorldPool")));
    this.name = name;
}

command threadpool => command group => command key

command key

6.png

  • 代表了一类command,代表底层的依赖服务的一个接口
  • command group

7.png

代表了某一个底层的依赖服务,合理,一个依赖服务可能会暴露出来多个接口,每个接口就是一个command key


command group

在逻辑上去组织起来一堆command key的调用,统计信息,成功次数,timeout超时次数,失败次数,可以看到某一个服务整体的一些访问情况

推荐是根据一个服务去划分出一个线程池,command key默认都是属于同一个线程池的


比如说你以一个服务为粒度,估算出来这个服务每秒的所有接口加起来的整体QPS在100左右

你调用那个服务的当前服务,部署了10个服务实例,每个服务实例上,其实用这个command group对应这个服务,给一个线程池,量大概在10个左右,就可以了,你对整个服务的整体的访问QPS大概在每秒100左右


一般来说,command group是用来在逻辑上组合一堆command的


举个例子,对于一个服务中的某个功能模块来说,希望将这个功能模块内的所有command放在一个group中,那么在监控和报警的时候可以放一起看

command group,对应了一个服务,但是这个服务暴露出来的几个接口,访问量很不一样,差异非常之大

你可能就希望在这个服务command group内部,包含的对应多个接口的command key,做一些细粒度的资源隔离

对同一个服务的不同接口,都使用不同的线程池

command key -> command group
command key -> 自己的threadpool key

逻辑上来说,多个command key属于一个command group,在做统计的时候,会放在一起统计


每个command key有自己的线程池,每个接口有自己的线程池,去做资源隔离和限流


但对于thread pool资源隔离来说,可能是希望能够拆分的更加一致一些,比如在一个功能模块内,对不同的请求可以使用不同的thread pool


command group一般来说,可以是对应一个服务,多个command key对应这个服务的多个接口,多个接口的调用共享同一个线程池


如果说你的command key,要用自己的线程池,可以定义自己的threadpool key,就ok了


4 coreSize

设置线程池的大小,默认是10

HystrixThreadPoolProperties.Setter()
               .withCoreSize(int value)

一般来说,用这个默认的10个线程大小就够了


5 queueSizeRejectionThreshold

控制queue满后reject的threshold,因为maxQueueSize不允许热修改,因此提供这个参数可以热修改,控制队列的最大值


HystrixCommand在提交到线程池之前,其实会先进入一个队列中,这个队列满了之后,才会reject


默认值是5

HystrixThreadPoolProperties.Setter()
   .withQueueSizeRejectionThreshold(int value)

线程池+queue的工作原理

8.png

6isolation.semaphore.maxConcurrentRequests

设置使用SEMAPHORE隔离策略的时候,允许访问的最大并发量,超过这个最大并发量,请求直接被reject


这个并发量的设置,跟线程池大小的设置,应该是类似的

但是基于信号量的话,性能会好很多,而且hystrix框架本身的开销会小很多


默认值是10,设置的小一些,否则因为信号量是基于调用线程去执行command的,而且不能从timeout中抽离,因此一旦设置的太大,而且有延时发生,可能瞬间导致tomcat本身的线程资源本占满

9.png

目录
相关文章
|
1月前
|
SpringCloudAlibaba Java 测试技术
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(六)Hystrix(豪猪哥)的使用
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(六)Hystrix(豪猪哥)的使用
36 1
|
7月前
|
缓存 Java 应用服务中间件
Hystrix线程池技术实现资源隔离
Hystrix线程池技术实现资源隔离
23 0
|
10月前
|
消息中间件 算法 Kafka
【Kafka从入门到放弃系列 五】Kafka架构深入——消费者策略
【Kafka从入门到放弃系列 五】Kafka架构深入——消费者策略
126 0
【Kafka从入门到放弃系列 五】Kafka架构深入——消费者策略
|
10月前
|
消息中间件 存储 缓存
【Kafka从入门到放弃系列 四】Kafka架构深入——生产者策略
【Kafka从入门到放弃系列 四】Kafka架构深入——生产者策略
131 0
【Kafka从入门到放弃系列 四】Kafka架构深入——生产者策略
|
11月前
|
应用服务中间件
高并发下hystrix熔断超时及concurrent.RejectedExecutionException: Rejected command because thread-pool queueSiz...
高并发下hystrix熔断超时及concurrent.RejectedExecutionException: Rejected command because thread-pool queueSiz...
235 0
|
数据采集 缓存 监控
【Hystrix技术指南】(5)Command创建和执行实现
【Hystrix技术指南】(5)Command创建和执行实现
158 0
【Hystrix技术指南】(5)Command创建和执行实现
|
消息中间件 缓存 NoSQL
Hystrix 实现资源隔离的 “两把利器”
这篇文章主要跟大家讲讲如何利用 Hystrix 实现资源隔离,一起来看看~
166 0
Hystrix 实现资源隔离的 “两把利器”
|
监控 容灾 数据可视化
微服务架构 | 5.1 使用 Netflix Hystrix 断路器
Hystrix 是一个延迟和容灾库,旨在隔离远程系统、服务和第三方库的访问点,停止级联故障,并在故障不可避免的复杂分布式系统中实现弹性;
237 0
微服务架构 | 5.1 使用 Netflix Hystrix 断路器
|
运维 监控 Java
高可用架构设计(2) - hystrix
Hystrix是什么 在分布式系统中,每个服务都可能会调用很多其他服务,被调用的那些服务就是依赖服务,有的时候某些依赖服务出现故障也是很常见的。 Hystrix可以让我们在分布式系统中对服务间的调用进行控制,加入一些调用延迟或者依赖故障的容错机制。 Hystrix通过将依赖服务进行资源隔离,进而避免某个依赖服务出现故障的时候,在整个系统所有的依赖服务调用中蔓延,同时Hystrix还提供故障时的fallback降级机制 总而言之,Hystrix通过这些方法帮助我们提升分布式系统的可用性和稳定性
96 0
高可用架构设计(2) - hystrix
|
缓存 监控 Java
Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)【Dalston版】
Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)【Dalston版】
158 0