Hystrix简介
本文主要参考:
https://github.com/Netflix/Hystrix/wiki
https://github.com/Netflix/Hystrix/wiki/Configuration
https://github.com/Netflix/Hystrix/wiki/How-it-Works
先简要的说一下什么是hystrix。
在分布式环境中,很多依赖的服务不可避免的会出现不可用的状态。hystrix是一个帮助你在分布式服务中添加延迟和容错逻辑的库。hystrix通过隔离服务间的访问,防止级联出错导致服务雪崩,同时提供了降级处理来实现容错。
hystrix有什么功能
- 保护和控制依赖第三方访问的延迟和错误。
- 防止在复杂的分布式环境中出现级联错误(服务雪崩)。
- 快速失败,快速恢复。
- 回退和优雅的降级
- 接近实时的监控,报警和操作控制。
hystrix为了解决什么问题
在复杂的分布式架构下,会有很多的依赖,每一个依赖的服务都不可避免的出现错误。如果这些服务能够和依赖的服务进行隔离,那么失败的可能性就会降低很多。
比如:一个应用依赖30个服务,每一个服务的可靠性是99.99%,那么就是这样的
99.9930 = 99.7% uptime
0.3% of 1 billion requests = 3,000,000 failures
2+ hours downtime/month even if all dependencies have excellent uptime.
这样是很糟糕的。
尽管每个服务的出错的可能只在0.01%,但是很多的服务依赖的情况下,整个服务的可用性还是很低。(每个月1个小时的故障时间)。
那么在这样的情况下,hystrix的设计原则是什么呢?
- 防止任何单个依赖用尽容器(tomcat等)的所有线程。
- 减少负载和快速失败,而不是排队。
- 在可行的情况下提供退路,保证用户不受故障影响
- 采用隔离技术(比如仓壁、泳道和断路器模式)来限制单个依赖产生的影响。
- 通过近乎实时的度量、监控和报警来优化发现时间
- 通过低延迟的配置更改hystrix的大多数动态属性来优化恢复时间,这允许使用低延迟反馈循环进行实时操作修改。
- 防止整个依赖客户端执行失败,而不仅仅是在网络通信中。
hystrix如何实现他的目标呢?
- 包装调用到外部系统也就是HystrixCommand或者是HystrixObservableCommand,这些命令是执行在一个独立的线程中。
- 调用时间超过你定义的阈值被认为是超时调用,超时时间有默认值,但是大部分可以通过自定义设置超时时间。
- 为每一个依赖管理一个小的线程池,如果线程池满了,那么依赖当前依赖的请求会直接拒绝然后返回,而不是排队。
- 度量成功数、失败数、超时数和线程拒绝数。
- 手动开启断路器一段时间阻止所有请求特定服务的请求,或者自动的等待失败率超过设置的阈值。
- 执行降级逻辑当请求出现错误,这些错误指的是拒绝、超时和短路。
- 近实时的监控配置和变化。
还没有评论,来说两句吧...