1 是什么
在分布式系统中有时候某些服务出现故障很正常。
Hystrix可以让我们在分布式系统中对服务间的调用进行控制,加入一些调用延迟或者依赖故障的容错机制。
Hystrix通过将依赖服务进行资源隔离,进而组织某个依赖服务出现故障的时候,这种故障在整个系统所有的依赖服务调用中进行蔓延,同时Hystrix还提供故障时的fallback降级机制
总而言之,Hystrix通过这些方法帮助我们提升分布式系统的可用性和稳定性。
2 发展史
NetflixAPI团队从2011年开始做一些提升系统可用性和稳定性的工作,Hystrix就是从那时候开始发展出来的。在2012年,Hystrix就变得比较成熟和稳定了,Netflix中,除了API团队以外,很多其他的团队都开始使用Hystrix。
2018 年 11 月,Hystrix 在其 Github 主页宣布,不再开放新功能,推荐开发者使用其他仍然活跃的开源项目。维护模式的转变绝不意味着 Hystrix 不再有价值。相反,Hystrix 激发了很多伟大的想法和项目,其思想仍值得我们深入学习!
3 设计哲学
Hystrix是为了保证分布式系统的高可用性:
- 对依赖服务调用时出现的调用网络延迟和调用接口失败提供控制和容错保护
- 在复杂的分布式系统中,阻止某一个依赖服务的故障在整个系统蔓延
- 提供fail-fast和快速恢复
- 提供fallback降级
- 支持近监控、报警以及运维 (1)阻止任何一个依赖服务耗尽所有的资源,比如tomcat中的所有线程资源 (2)避免请求排队和积压,采用限流和fail fast来控制故障 (3)提供fallback降级机制来应对故障 (4)使用资源隔离技术,比如bulkhead(舱壁隔离技术),swimlane(泳道技术),circuit breaker(短路技术),来限制任何一个依赖服务的故障的影响 (5)通过近实时的统计/监控/报警功能,来提高故障发现的速度 (6)通过近实时的属性和配置热修改功能,来提高故障处理和恢复的速度 (7)保护依赖服务调用的所有故障情况,而不仅仅只是网络故障情况
调用这个依赖服务的时候,client调用包有bug,阻塞,等等,依赖服务的各种各样的调用的故障,都可以处理
- 依赖服务的故障导致服务被拖垮以及故障的蔓延示意图
4 如何实现目标
- 通过HystrixCommand或者HystrixObservableCommand封装对外部依赖的访问请求,这个访问请求一般会运行在独立的线程中,资源隔离
- 对于超出我们设定阈值的服务调用,直接进行超时,不允许其耗费过长时间阻塞住。这个超时时间默认是99.5%的访问时间,但是一般我们可以自己设置一下
- 为每一个依赖服务维护一个独立的线程池,或者是semaphore,当线程池已满时,直接拒绝对这个服务的调用
- 统计依赖服务的调用的成功次数,失败次数,拒绝次数,超时次数
- 如果对一个依赖服务的调用失败次数超过了一定的阈值,自动熔断,在一定时间内对该服务的调用直接降级,一段时间后再自动尝试恢复
- 当一个服务调用出现失败,被拒绝,超时,短路等异常情况时,自动调用fallback降级机制
- 对属性和配置的修改提供近实时支持
- 资源隔离如何保护依赖服务的故障不要拖垮整个系统