简单了解Hystrix的舱壁隔离

通过Hystrix的简单实现这篇博文,可以了解到我们为什么要使用Hystrix以及如何简单使用Hystrix的功能

不过我突然意识到,我的系统可是要调用好多个三方接口的,那么如果其中一个第三方接口出现了问题,要是在高并发的情况下,所有的资源都会被这个第三方接口所耗尽,那其他的接口就没法做事了,再夸张点,还会造成系统宕机。

那这时候引入Hystrix还有什么用,在上述情况下,他容错降级的功能形同虚设?

答案是Hystrix一样是可以起到作用的,Hystrix采用了依赖隔离的方式,不过我更喜欢称呼为"舱壁隔离"。

什么是舱壁隔离

可以用轮船的舱壁设计来举例,轮船底下船舱一个个都是互相隔离的,这样一旦哪个舱壁出现漏水也影响不到其他的船舱,Hystrix也是一样,他为每一个需要被调用的服务维护了一个独立的线程池,这样每个服务都有自己的使用资源,当某个服务出现问题时,大家互不影响。

舱壁隔离会影响性能么

会的,毕竟每个服务都要维护了一个自己的线程池,说不影响是假的,不过Hystrix的开发人员也对Hystrix对性能的影响做了测试,隔离所带来的好处比开辟多个线程池会产生的开销大的多,至少用了依赖隔离,安全性和可用性又会大大提升,一个系统要是用都不能用,还谈什么性能。

使用舱壁隔离的优点

  • 整个系统的安全性和可用性被提高了,保证一个依赖服务不会被其他服务拖垮

  • 当依赖的服务出现错误时,线程池可以及时反馈问题。

  • 比起容器级别的线程池清理速度,舱壁隔离采用的独有线程池无疑是快的多,这样也有利于在依赖服务失效后的快速恢复。

  • 当引入新的依赖服务的时候,由于是依赖隔离的,其余服务不会被影响,系统可以很流畅的接受新依赖服务。

  • 每个线程池还可以有自己的监控信息,可以针对想对应的依赖服务反应出这种变化

  • 每个线程池还可以有自己内置的并发实现,这样可以为同步的依赖服务,构建异步访问。

实现舱壁隔离的方式

  • 线程池隔离
  • 信号量隔离

对于信号量隔离我理解为对线程池隔离的一个补充功能,如果开辟专有线程池的开销远远大于该依赖服务正常的访问时间,那么我们就可以使用信号量隔离。

信号量的开销确实是小于线程池的开销的,不过信号量做不到线程池的设置超时和异步访问,所以啊,在确保服务确实靠谱的情况下,再采用信号量哈

发布了136 篇原创文章 · 获赞 109 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_38106322/article/details/103910728