什么是Hystrix?
在分布式环境中,不可避免地会有许多服务依赖项失败。Hystrix是一个库,通过添加延迟容忍和容错逻辑,帮助您控制这些分布式服务之间的交互。Hystrix通过隔离服务之间的访问点、停止跨服务的级联故障并提供回退选项来实现这一点,所有这些都可以提高系统的总体弹性。
Hystrix是干什么用的?
1 保护和控制调用第三方客户端库的依赖(通常是通过网络)的延迟和失败。
2 防止复杂分布式系统中的级联故障。
3 快速失败和快速恢复。
4 回退(配置回退方法)并尽可能优雅降级。
5 启用近实时监视、警报和操作控制。
下面讲述一个级联故障的例子。
可以看到 App Container服务调用了很多的第三方服务,当服务都可用的情况下没什么问题。
但是当一个依赖的I第三方服务网络调用延时或者服务挂掉的情况下会导致调用方用户线程阻塞。
在高流量的情况下,单个后端依赖项(dependency I)的潜在影响可能会导致所有服务器(调用方)上的所有资源在几秒钟内饱和。
应用程序中通过网络或进入客户端库可能导致网络请求的每一点都是潜在故障的根源。比故障更糟糕的是,这些应用程序还会导致服务之间的延迟增加,导致更多的级联故障。
那么豪猪(hystrix)是如何做的呢?
1 将对外部系统(或“依赖项”)的所有调用包装在HystrixCommand或HystrixObservableCommand对象中,该对象通常在单独的线程中执行(这是命令模式的一个示例)。
2 超时调用的时间长于您定义的阈值。有一个默认值,但是对于大多数依赖项,您可以通过“属性”自定义设置这些超时,以便它们比每个依赖项的99.5%的性能略高。
3 为每个依赖项维护一个小的线程池(或信号量);如果它已经满了,针对该依赖项的请求将立即被拒绝,而不是排队。
4 记录成功、失败(客户端抛出的异常)、超时和线程拒绝。
5 如果服务的错误百分比超过阈值,可以自动或者手动的断开断路器,以在一段时间内停止对特定服务的所有请求。
6 在请求失败、被拒绝、超时或短路时执行回退逻辑。
7 几乎实时地监视度量和配置更改。
当您使用Hystrix包装每个底层依赖项时,上面图中所示的体系结构将发生变化,将变成下面的图。每个依赖项都是相互隔离的,当延迟发生时,分配给被调用方的资源项(线程池)的资源将会饱和,将会触发断路器并调用预先设定的回调函数,使得不影响调用方,并在当被调用方恢复后会关闭短路器。
下面看看Hystrix的实现逻辑
流程如下:
1 构造一个HystrixCommand或HystrixObservableCommand对象
2 执行命令
3 是否缓存了响应
4 电路打开了吗
5 线程池/队列/信号量是否已满
6 执行HystrixObservableCommand.construct()或HystrixCommand.run()
7 计算电路健康
8 执行回退函数
9 返回成功响应
Circuit Breaker(断路器)逻辑:
电路开闭的条件如下:
1 假设电路的请求音量满足域值 HystrixCommandProperties.circuitBreakerRequestVolumeThreshold()
2 假设误差百分比超过阈值误差百分比
HystrixCommandProperties.circuitBreakerErrorThresholdPercentage()
3 断路器从闭合过渡到打开
4. 当它是开着的,它短路了所有对断路器的要求。
5.过了一段时间(HystrixCommandProperties.circuitBreakerSleepWindowInMilliseconds())
短路器处于半开状态,此时允许1个请求通过执行,当请求执行成功,则短路器从打开到闭合,若此时请求还是失败,则继续阻断所有请求。
参考:https://github.com/Netflix/Hystrix/wiki/How-it-Works#flow1
网友评论