- 前言
Hystrix是Spring Cloud中的一项重要的技术,是cloud服务调用过程中进行熔断必不可少的一步。
Hystrix目前是有两种隔离策略,分别是线程池隔离和信号量隔离。
- 隔离策略
- 线程池隔离
如其名,他的隔离是通过线程池来做到的,也就是说他的隔离粒度是线程池。一个请求进来都经过一个线程池。
当前端发起请求过来到服务A或者B之后,服务A和服务B是通过线程池隔离的。服务A是否熔断,是否正常都和服务B无关。
他其实是一个异步编程,用线程池将后面的服务包裹了起来,至于服务内部tomcate的线程运行怎么样是无关的。他适合于绝大多数的场景,对于一些超时的场景都非常好用。但是既然是通过线程池来操作的,不可避免的就是线程之间的计算开销,以及线程上下文的切换,调度消耗。
- 信号量隔离
如其名,他的隔离是通过信号量来做到的。他其实是一个计数器。一个请求进来就会减少一个信号,一个请求完成就会增加一个信号。
信号量的调用时同步的,也就是说他会阻塞直到请求回来。所以他自身是不能实现超时的,因此这里的超时只能依靠协议的超时来做,否则是无法释放的(比如socket超时等等)。所以当此服务不对外部服务依赖同时自身没有大量的计算或者说经过这个服务的时间比较短,则非常适合信号量,比如说spring cloud的zuul的gateway网关。
- 策略区别
线程池隔离:
1.和调用线程不是同一个线程,因此支持异步
2.线程上下文需要切换,调度的消耗
3.最大并发量取决于线程池大小
4.适合有计算,会有耗时操作的服务
5.保护tomcate线程,不至于tomcate一直阻塞,一旦不对,立马失败或者超时返回
信号量隔离:
1.和调用线程是同一个线程,因此只能同步
2.无线程切换,开销低,因此可快速进行反应
3.最大并发量取决于信号量大小
4.适合低计算,快速通信的服务