介绍
Hystrix通过 隔离 服务之间的访问点,阻止它们之间的级联故障以及提供回退选项来实现这一点,从而提高系统的整体弹性。
hystrix提供了两种隔离策略:线程池隔离 和 信号量隔离
hystrix默认采用 线程池隔离
线程池隔离
不同服务通过使用不同线程池,彼此间将不受影响,达到隔离效果。
将发送请求线程 与 执行请求的线程分离,可有效防止发生级联故障。当线程池或请求队列饱和时,Hystrix将拒绝服务,使得请求线程可以快速失败,从而避免依赖问题扩散
应用场景
请求并发量大,并且耗时长(请求耗时长一般是计算量大,或读数据库):采用线程隔离策略,这样,可以保证大量的容器(tomcat)线程可用,不会由于服务原因,一直处于阻塞或等待状态,快速失败返回。
优点
1、用用线程池隔离可以完全隔离依赖的服务,请求线程县城可以快速放回;
2、当线程池出现问题时,线程池隔离是独立的,不会影响其他服务和接口;
3、当失败的服务再次变得可用时,线程池将清理并可立即回复,而不需要一个长时间的恢复;
4、独立的线程池提高了并发性。
缺点
增加计算开销(CPU),每个命令的执行都在单独的线程完成,增加了排队、调度和上下文切换的开销
信号量隔离
由于线程池隔离的缺点,当依赖延迟极低的服务时,线程池隔离技术引入的开销超过了它所带来的好处。这时候可以使用信号量隔离技术来代替,通过设置信号量来限制对任何给定依赖的并发调用量。
应用场景
请求并发量大,并且耗时短(请求耗时短可能是计算量小,或读缓存),采用信号量隔离策略,因为这类服务的返回通常会非常的快,不会占用容器线程太长时间,而且也减少了线程切换的一些开销,提高了缓存服务的效率。
区别
| 线程切换 | 支持异步 | 支持超时 | 支持熔断 | 限流 | 开销 | |
|---|---|---|---|---|---|---|
| 信号量 | 否 | 否 | 否 | 是 | 是 | 小 |
| 线程池 | 是 | 是 | 是 | 是 | 是 | 大 |
| 线程池 | 信号量 | |
|---|---|---|
| 线程切换 | 是(请求线程和执行线程不是同一个线程) | 否 |
| 支持异步 | 是 | 否 |
| 支持超时 | 是 | 否 |
| 开销 | 大(排队、调度和上下文切换) | 小 |
| 支持熔断 | 是 | 是 |
| 并发限制 | 支持(线程池最大线程数) | 支持(信号量上限) |
信号量 不支持 异步 和 超时,也就是说当所请求的服务不可用时,信号量会控制超过限制的请求立即返回,但是已经持有信号量的线程只能等待服务响应或从超时中返回,即可能出现长时间等待。
相关参数
线程池参数
groupKey
服务名(相同服务用一个名称,如商品、用户等)commandKey
接口(服务下面的接口,如果购买商品)threadPoolkey
线程池的名称:配置全局唯一标识线程池的名称,相同线程池名称的线程池是同一个;coreSize
线程池大小,这是最大的并发执行数量maxQueueSize
最大队列长度,设置BlockingQueue的最大长度queueSizeRejectionThreshold
拒绝请求,设置拒绝请求的临界值keepAliveTimeMinutes
线程存活时间,设置存活时间,单位分钟
信号量参数
execution.isolation.strategy
隔离策略配置项,有thread和semaphore两种execution.isolation.thread.timeoutInMiliseconds
超时时间,在thread模式下,达到超时时间,自动中断,在semaphore模式下,会等待执行完成后,再去判断是否超时execution.isolation.thread.interruptOnTimeout
是否打开超时线程中断,thread模式有效execution.isolation.semaphore.maxConcurrentRequests
信号量最大并发度,semaphore模式有效fallback.isolation.semaphore.maxConcurrentRequests
fallback最大并发度,semaphore模式有效
感谢:
https://blog.csdn.net/loushuiyifan/article/details/82702522