Hystrix是什么
在分布式环境中,许多服务依赖项中的一些不可避免地会失败。Hystrix是一个库,它通过添加延迟容忍和容错逻辑来帮助您控制这些分布式服务之间的交互。Hystrix通过隔离服务之间的访问点,停止它们之间的级联故障,并提供回退选项来实现这一点,所有这些都提高了系统的整体弹性。
Hystrix是做什么的
- 对通过第三方客户端库访问的依赖项(通常通过网络)的延迟和故障提供保护和控制。
- 停止复杂分布式系统中的级联故障。
- 失败后快速恢复。
- 如果可能的话,回退并优雅地降级。
- 启用接近实时的监视、警报和操作控制。
Hystrix解决了什么问题
在复杂的分布式体系结构中的应用程序有几十个依赖项,每个依赖项在某一时刻都不可避免地会失败。如果主机应用程序不能与这些外部故障隔离,它就有可能随着这些外部故障而宕机。
例如,对于一个依赖于30个服务的应用程序,每个服务都有99.99%的正常运行时间,以下是你可以期待的:
99.9930 = 99.7% 正常运行时间
10亿次请求的0.3% = 300万次失败
2个小时以上的停机时间/月,即使所有依赖有良好的正常运行时间。
现实情况通常更糟
即使所有依赖项都表现良好,如果您没有为整个系统进行弹性设计,那么即使0.01%的停机时间对数十个服务中的每个服务造成的总体影响也相当于一个月可能停机几个小时。
当许多后端系统中的一个不可用时,它可以阻塞整个用户请求:
在高流量的情况下,单个后端依赖关系不可用时,可能会导致所有服务器上的所有资源在数秒内饱和。
应用程序中可能会导致网络请求通过网络或客户端库传播的每个点都是潜在故障的根源。比故障更糟糕的是,这些应用程序还可能导致服务之间的延迟增加,从而备份队列(backs up queues)、线程和其他系统资源,从而导致跨系统发生更多的级联故障。
当通过第三方客户端执行网络访问时,这些问题会更加严重。第三方客户端是一个“黑盒”,实现细节被隐藏,可以随时更改,每个客户端库的网络或资源配置不同,通常很难监控和更改。
更糟糕的是,传递依赖项执行潜在的昂贵或容易出错的网络调用,而应用程序没有显式地调用它们。
网络连接失败或降级。服务和服务器故障或变慢。新的库或服务部署会改变行为或性能特征。客户端库有bug。
所有这些都表示需要隔离和管理的故障和延迟,以便单个故障依赖项不会导致整个应用程序或系统停机。
Hystrix的设计原则是什么?
- 防止任何单一依赖耗尽所有容器(如Tomcat)用户线程。
- 减少负载和快速失败,而不是排队。
- 在可行的情况下提供后备方案以保护用户不受故障的影响。
- 使用隔离技术(如舱壁(bulkhead)、泳道(swimlane)和断路器(circuit breaker)模式)来限制任何一个依赖项的影响。
- 通过接近实时的度量、监视和警报来优化发现时间
- 通过配置更改的低延迟传播和Hystrix在大多数方面的动态属性更改来优化恢复时间,这允许您通过低延迟反馈循环进行实时操作修改。
- 防止在整个依赖客户端执行过程中发生故障,而不仅仅是在网络流量中。
Hystrix如何实现其目标?
- 将所有