Hystrix概念及文档理解
什么是Hystrix
Hystrix是一个库,它提供了服务与服务之间的容错功能,主要体现在延迟容错和容错,从而做到控制分布式系统中的联动故障。Hystrix通过隔离服务的访问点,阻止联动故障,并提供故障的解决方案,从而提高了这个分布式系统的弹性。
Hystrix作用
服务由于某种故障,比如机房的不可靠性、网络服务商的不可靠性等因素,导致某个服务不可用,如果系统不隔离该不可用的服务,可能会导致整个系统不可用。
在高并发的情况下,单个服务的延迟,可能导致所有的请求都处于延迟状态,可能在几秒钟就使服务处于负载饱和的状态。服务的单个点的请求故障,会导致整个服务出现故障,更为糟糕的是该故障服务,会导致其他的服务出现负载饱和,资源耗尽,直到不可用,从而导致这个分布式系统都不可用。这就是“雪崩”。
对于以上的情况,避免雪崩,我们就需要快速反应,网络连接失败或降级。 服务和服务器失败或变慢。 新的库或服务部署会改变行为或性能特征。 客户端库有错误。这些都代表需要隔离和管理的故障和延迟,以便单个故障依赖关系不能导致整个应用程序或系统的故障。这就是Hystrix需要处理的。
Hystrix的设计原则
- 防止单个服务的故障,耗尽整个系统服务的容器(比如tomcat)的线程资源。 减少负载并快速失败,而不是排队。
- 在可行的情况下提供回退以保护用户免受故障。 使用隔离技术(如隔板,泳道和断路器模式)来限制任何一个依赖的影响。
- 通过近乎实时的指标,监控和警报来优化发现故障的时间。
- 通过配置更改的低延迟传播优化恢复时间,并支持Hystrix大多数方面的动态属性更改,从而允许您使用低延迟反馈循环进行实时操作修改。
- 保护整个依赖客户端执行中的故障,而不仅仅是在网络流量上进行保护降级、限流。
Hystrix设计实现
- 通过HystrixCommand 或者HystrixObservableCommand
将所有的外部系统(或者称为依赖)包装起来,整个包装对象是单独运行在一个线程之中(这是典型的命令模式)。 - 超时请求应该超过你定义的阈值
- 为每个依赖关系维护一个小的线程池(或信号量); 如果它变满了,那么依赖关系的请求将立即被拒绝,而不是排队等待。
- 统计成功,失败(由客户端抛出的异常),超时和线程拒绝。
- 打开断路器可以在一段时间内停止对特定服务的所有请求,如果服务的错误百分比通过阈值,手动或自动的关闭断路器。
- 当请求被拒绝、连接超时或者断路器打开,直接执行fallback逻辑。
- 近乎实时监控指标和配置变化。
Hystrix工作原理
1、构建一个HystrixCommand或者HystrixObservableCommand 对象。
2、执行Command。
补充知识:
通过使用Hystrix命令对象的以下四种方法之一,可以执行该命令有四种方法(前两种方法仅适用于简单的HystrixCommand对象,并不适用于HystrixObservableCommand):
- execute()–阻塞,,然后返回从依赖关系接收到的单个响应(或者在发生错误时抛出异常)。
- queue()–返回一个可以从依赖关系获得单个响应的future 对象。
- observe()–订阅Observable代表依赖关系的响应,并返回一个Observable,该Observable会复制该来源Observable。
- toObservable() --返回一个Observable,当您订阅它时,将执行Hystrix命令并发出其响应。
同步调用execute()调用queue().get(). queue()依次调用toObservable().toBlocking().toFuture()。 这就是说,最终每个HystrixCommand都由一个Observable实现支持,甚至是那些旨在返回单个简单值的命令。
3、判断响应是否有缓存
4、
。。。待补充
9、
Hystrix项目实践分析
构建项目hystrix-demo,待完善