![2cda323de76ba91969456f7a48e00233.png](https://i-blog.csdnimg.cn/blog_migrate/4d0da5bdb0d230afc3eaba9b532bbe5d.png)
解决方法(一):
线程隔离:
什么是线程隔离:
![7bf9818982e9fa77bf0aa68a1cd014d6.png](https://i-blog.csdnimg.cn/blog_migrate/abce3e3a25560d9ab4a441f9ec0535fb.jpeg)
![6427ff1208b0c65f4805de67a75e753b.png](https://i-blog.csdnimg.cn/blog_migrate/61891d439086891732c467f57c630070.jpeg)
![0c0fb440bae49d013f92b44793da1733.png](https://i-blog.csdnimg.cn/blog_migrate/d29dce92a6d02a4c5e2ff8132ef8bc7c.jpeg)
![7a63a285e1e5bea9f9e1732771bdf957.png](https://i-blog.csdnimg.cn/blog_migrate/ae1ed757a08d98de4e11c7c3c0c78a63.jpeg)
推断出那个接口请求量大,将这个接口与其他接口分隔出来,独立的运行在线程池中。
优缺点:
优点:
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,也可以理解为给大量的请求分组,其余的没在分组中的请求返回托底数据。
![a83b6c3fae2b5046e4cfa8b8cb04fe24.png](https://i-blog.csdnimg.cn/blog_migrate/122e17b214958e8e5291df46c9689f9a.jpeg)
怎么去实行信号量隔离:
添加坐标:
<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")//信号量最大并度
})
线程池隔离与信号量隔离有什么区别?
![f7b336e6e5a3cbb61cefac9fde09bd1a.png](https://i-blog.csdnimg.cn/blog_migrate/81a593d769f501aa36f897804240fea3.jpeg)
什么情况下使用线程池隔离?
请求并发量大,并且耗时长(请求耗时长一般是计算量大,或读数据库) :
采用线程隔离策略,这样的话,可以保证大量的容器(tomcat)线程可用,不会由于服务原因, -直处于阻塞或等待状态,快速失败返回。
什么情况下使用信号量隔离?
请求并发量大,并且耗时短(请求耗时短可能是计算量小,或读缓存) :
采用信号量隔离策略,因为这类服务的返回通常会非常的快,不会占用容器线程太长时间,而且也减少了线程切换的一些开销,提高了缓存服务的效率。