hystrix隔离机制:线程池隔离和信号量隔离及配置参数

介绍

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