1.相关介绍:
Hystrix 是世界最大在线影片租赁服务商Netflix开源,针对分布式系统的延迟
和容错库。该库由Java写成,项目源于Netflix API团队在2011年启动的弹性工
程项目
源代码: https://github.com/Netflix/Hystrix
相关使用文档:https://github.com/Netflix/Hystrix/wiki
2.为何使用hystrix:
1.复杂分布式架构:依赖多,某个服务会失败
2.某个依赖出现故障,应用被拖垮风险
3.高流量网站单一服务延迟,所有应用资源被耗尽风险(线程,队列,cpu等)
盗用官网一张图
如果依赖服务出现问题:
3.hystrix能做哪些事:
使用Hystrix对依赖服务进行异常情况下的隔离和降级,
同时配合Rpc框架(Dubbo,grpc,spring cloud)
对依赖服务的整理和监控工作
4.Hystrix如何解决依赖隔离
1).Hystrix用命令模式包装依赖调用逻辑
2).可配置依赖调用超时时间
3).每个依赖——一个小的线程池(或信号)
4).fallback(降级)逻辑
5).提供熔断器组件
6).近实时依赖的统计和监控
5.hystrix使用 :
引入包:
拦截器配置:
监控配置:
6.hystrix使用方式 :
关于HystrixCommand的使用方式,这里只介绍关于注解的方式,关于继承HystrixCommand的方式可以查看:https://github.com/Netflix/Hystrix/wiki/How-To-Use
HystrixCommand调用支持三种方式:
同步执行,异步执行,反应执行。
三种方式区别:
同步执行:当执行到注解方法时,程序会顺序执行。
相关代码:
异步执行:当执行到注解方法时,会并发异步执行,返回一个Future对象:
相关代码:
后面使用.get()方法来阻塞拿到结果。如果有多个方法时,执行时间就是
其中最长的一个服务的执行时间。
反应执行:当执行到注解方法时,返回一个观察者。
相关代码:
支持EAGER和LAZY模式。和同步异步执行的区别是,
当对多个方法之间的返回结果不需要做合并而是希望当
多个方法返回时触发一些事件时比较适合使用该模式。
7.异常处理和降级方法:
相关代码:
注意点:
•fallback应该和注解方法在同一类下
•fallback的返回值和参数列表应该和注解方法一致,如果需要异常,则在末尾添加Throwable参数,对访问修饰符无要求
•fallback方法上可以继续添加fallback
command和fallback只支持以下几种组合:
•sync command, sync fallback
•async command, sync fallback
•async command, async fallback
hystrix相关参数配置:
8.参数说明:
groupKey表示所属的group,一个group共用线程池默认值:getClass().getSimpleName();
commandKey 默认值:当前执行方法名
execution.isolation.strategy隔离策略,有THREAD和SEMAPHORE默认使用THREAD模式,以下几种可以使用SEMAPHORE模式:
•只想控制并发度
•外部的方法已经做了线程隔离
•调用的是本地方法或者可靠度非常高、耗时特别小的方法(如medis)
execution.isolation.thread.timeoutInMilliseconds
超时时间默认值:1000
在THREAD模式下,达到超时时间,可以中断
在SEMAPHORE模式下,会等待执行完成后,再去判断是否超时
设置标准:
有retry,99meantime+avg meantime
没有retry,99.5meantime
execution.timeout.enabled是否打开超时
execution.isolation.thread.interruptOnTimeout是否打开超时线程中断THREAD模式有效
execution.isolation.semaphore.maxConcurrentRequests信号量最大并发度SEMAPHORE模式有效,默认值:10
fallback.isolation.semaphore.maxConcurrentRequestsfallback最大并发度默认值:10
circuitBreaker.requestVolumeThreshold熔断触发的最小个数/10s默认值:20
circuitBreaker.sleepWindowInMilliseconds熔断多少秒后去尝试请求默认值:5000
circuitBreaker.errorThresholdPercentage失败率达到多少百分比后熔断默认值:50
主要根据依赖重要性进行调整
circuitBreaker.forceClosed是否强制关闭熔断如果是强依赖,应该设置为true
coreSize线程池coreSize默认值:10
设置标准:qps*99meantime+breathing room
maxQueueSize请求等待队列默认值:-1
如果使用正数,队列将从SynchronizeQueue改为LinkedBlockingQueue
线程隔离的优点:
[1]:使用线程可以完全隔离第三方代码,请求线程可以快速放回。
[2]:当一个失败的依赖再次变成可用时,线程池将清理,并立即恢复可用,而不是一个长时间的恢复。
[3]:可以完全模拟异步调用,方便异步编程。
线程隔离的缺点:
[1]:线程池的主要缺点是它增加了cpu,因为每个命令的执行涉及到排队(默认使用SynchronousQueue避免排队),调度和上下文切换。
[2]:对使用ThreadLocal等依赖线程状态的代码增加复杂性,需要手动传递和清理线程状态。
NOTE: Netflix公司内部认为线程隔离开销足够小,不会造成重大的成本或性能的影响。
Netflix 内部API 每天100亿的HystrixCommand依赖请求使用线程隔,每个应用大约40多个线程池,每个线程池大约5-20个线程。
信号量隔离:
信号隔离也可以用于限制并发访问,防止阻塞扩散, 与线程隔离最大不同在于执行依赖代码的线程依然是请求线程(该线程需要通过信号申请),
如果客户端是可信的且可以快速返回,可以使用信号隔离替换线程隔离,降低开销.
9.hystrix监控:
官方监控介绍:
https://github.com/Netflix/Hystrix/wiki/Dashboard
相关效果:
10.hystrix工作原理:
相关架构图(图1):
相关架构图(图2):
相关架构图(图3):
原理介绍 :
1:每次调用创建一个新的HystrixCommand,把依赖调用封装在run()方法中.
2:执行execute()/queue做同步或异步调用.
3:判断熔断器(circuit-breaker)是否打开,如果打开跳到步骤8,进行降级策略,如果关闭进入步骤.
4:判断线程池/队列/信号量是否跑满,如果跑满进入降级步骤8,否则继续后续步骤.
5:调用HystrixCommand的run方法.运行依赖逻辑
5a:依赖逻辑调用超时,进入步骤8.
6:判断逻辑是否调用成功
6a:返回成功调用结果
6b:调用出错,进入步骤8.
7:计算熔断器状态,所有的运行状态(成功, 失败, 拒绝,超时)上报给熔断器,用于统计从而判断熔断器状态.
8:getFallback()降级逻辑.
以下四种情况将触发getFallback调用:
(1):run()方法抛出非HystrixBadRequestException异常。
(2):run()方法调用超时
(3):熔断器开启拦截调用
(4):线程池/队列/信号量是否跑满
网友评论