背景
最近接手了一个系统, 其功能都是查询. 查询分了两种方式, 一种是公司集团提供的查询能力, 支持全国各个省份的查询, 但是业务高峰期时服务响应比较慢; 另外一种是各省的分公司都分别提供了对应的查询能力, 但是服务质量相对较差, 业务高峰期服务超时较多, 而且分公司系统升级时也会影响服务质量. 为了提升服务查询的成功率, 可以将两种查询方式结合起来. 比较完备方案就是优先使用各省分公司提供的服务, 当分公司的服务质量下降后降级到公司集团对应的服务. 很早就听过 Hystrix, 用在现用系统服务质量提升的改造上, 再适合不过了.
Hystrix 简介
Hystrix 是 Netflix 开源的一款容错系统, 能帮助开发者码出具备强大的容错能力和鲁棒性的程序!
Hystrix 功能
1, 对依赖的服务 (HTTP 调用, SOA 服务) 进行保护, 并且把控住由于依赖服务所带来的的延迟和失败.
2, 防止在一个复杂的分布式系统里出现级联失效(cascading failures).
3, 快速失败(Fail fast), 并且快速恢复依赖服务.
4, 优雅的降级.
5, 实时的监控和报警.
健康状态系统
请求被阻塞系统
任何的 RPC 都可能会面临三种情况: 成功, 失败, 超时. 如果一次用户请求所依赖外部服务 (A,H,I,P) 有任何一个不可用, 就有可能导致整个用户请求被阻塞. 考虑到应用容器的线程数目基本都是固定的, 当在高并发的情况下, 某一外部依赖的服务超时阻塞, 就有可能使得整个主线程池被占满 线程池被占满就会导致整个服务不可用, 而依赖该服务的其他服务, 就又可能会重复产生上述问题. 因此整个系统就像雪崩一样逐渐的扩散, 坍塌, 崩溃了!
舱壁隔离模式(Bulkheads)
货船为了进行防止漏水和火灾的扩散, 将船的底部划分成一个个的舱室, 这样一个舱室进水不会导致整艘船沉没.
服务雪崩
隔离架构
降级 - 触发 fallback
1,run()/construct 方法抛出非 HystrixBadRequestException 异常
2,run()/construct()运行超时
3, 熔断器启动
4, 线程池 / 信号量拒绝
隔离策略
线程池隔离: 会带来线程开销
- Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("ThreadPoolTestGroup"))
- .andCommandKey(HystrixCommandKey.Factory.asKey("testCommandKey"))
- // 与其他命名的线程池天然隔离
- .andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey("ThreadPoolTest"))
信号量隔离: 服务的并发数大于信号量阈值时将进入 fallback 采用资源计数法, TryableSemaphore
- .andCommandPropertiesDefaults( // 配置信号量隔离
- HystrixCommandProperties.Setter()
- .withExecutionIsolationStrategy(ExecutionIsolationStrategy.SEMAPHORE)
- .withExecutionIsolationSemaphoreMaxConcurrentRequests(3)
- // fallback(降级)调用最大的并发数
- .withFallbackIsolationSemaphoreMaxConcurrentRequests(10))
熔断器
熔断相当于家里电压过大电路的跳闸功能, 跳闸可以保护我们的电器, 在代码中类比就是将调用的服务直接给屏蔽了, 不再调用调用远程服务器的服务 举个栗子, 配置熔断策略为 当请求错误比例在 5s 内 > 50% 时, 该服务将进入熔断状态.
熔断器默认工作时间, 默认: 5 秒, 熔断器中断请求 5 秒后会进入半打开状态, 放部分流量过去重试.
熔断器的开关能保证服务调用者在 调用异常服务时, 快速返回结果, fail fast or fallback static, 避免大量的同步等待 并且熔断器能在一段时间后 继续侦测请求执行结果, 提供恢复服务调用的可能.
请求结果 cache
将一个请求结果缓存起来, 下一个具有相同 key 的请求 将直接从缓存中取出结果, 减少请求开销.
Hystrix 设计点
资源隔离
熔断器模式
命令模式
观察者模式
RxJava
自助服务系统查询改造方案
命令调用模式, 省端直连接口; 降级调用模式, 集团电商接口.
自助服务整合 Hystrix 后系统请求流程图.
参考链接
- http://www.jianshu.com/p/b9af028efebb
- https://github.com/Netflix/Hystrix/wiki
- https://github.com/Netflix/Hystrix/wiki/How-To-Use
- https://segmentfault.com/a/1190000005988895
- http://kriszhang.com/hystrix_defend_your_webapp
- https://blog.51cto.com/snowtiger/2057092
来源: https://www.cnblogs.com/hujunzheng/p/11570189.html