解决方法(一):
线程隔离:
什么是线程隔离:
推断出那个接口请求量大,将这个接口与其他接口分隔出来,独立的运行在线程池中。
优缺点:
优点:
1. 使用线程池隔离可以完全隔离依赖的服务 ,请求线程可以快速放回。
2. 当线程池出现问题时,线程池隔离是独立的,不会影响其他服务和接口。
3.当失败的服务再次变得可用时,线程池将清理并可立即恢复,而不需要一个长时间的恢复。
4.独立的线程池提高了并发性。
缺点:
线程池隔离的主要缺点是它们增加计算开销( CPU) .每个命令的执行涉及到排队、调度和上下文切换都是在一个单独的线程上运行的。
怎么去实行线程隔离:
@HystrixCommand(groupKey="ego-product-provider", commandKey = "getUsers",
threadPoolKey="ego-product-provider",
threadPoolProperties = {
@HystrixProperty(name = "coreSize", value = "30"),//线程池大小
@HystrixProperty(name = "maxQueueSize", value = "100"),//最大队列长度
@HystrixProperty(name = "keepAliveTimeMinutes", value = "2"),//线程存活时间
@HystrixProperty(name = "queueSizeRejectionThreshold", value = "15")//拒绝请求
},
fallbackMethod = "fallback")
信号量隔离:
什么是信号量隔离:
当大量请求请求provider的时候,通过队列来限定有多少请求可以访问provider,也可以理解为给大量的请求分组,其余的没在分组中的请求返回托底数据。
怎么去实行信号量隔离:
添加坐标:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
配置:
@HystrixCommand(fallbackMethod = "fallback",
commandProperties = {
@HystrixProperty(name=HystrixPropertiesManager.EXECUTION_ISOLATION_STRATEGY, value="SEMAPHORE"),// 信号量 隔离
@HystrixProperty
(name=HystrixPropertiesManager.EXECUTION_ISOLATION_SEMAPHORE_MAX_CONCURRENT_REQUESTS, value="100")//信号量最大并度
})
线程池隔离与信号量隔离有什么区别?
什么情况下使用线程池隔离?
请求并发量大,并且耗时长(请求耗时长一般是计算量大,或读数据库) :
采用线程隔离策略,这样的话,可以保证大量的容器(tomcat)线程可用,不会由于服务原因, -直处于阻塞或等待状态,快速失败返回。
什么情况下使用信号量隔离?
请求并发量大,并且耗时短(请求耗时短可能是计算量小,或读缓存) :
采用信号量隔离策略,因为这类服务的返回通常会非常的快,不会占用容器线程太长时间,而且也减少了线程切换的一些开销,提高了缓存服务的效率。