1. hystrix的作用
- 基于命令模式的请求:解耦了请求者和接受者,使得发送出去的命令可以排队、异步执行。
- 资源隔离:用ConcurrentHashMap绑定commandKey和线程池,当某个功能运行不稳定或有问题时,服务的其他部分不受影响。服务恢复比较快。
- 熔断和服务降级:用ConcurrentHashMap绑定commandKey和HystrixCircuitBreaker类(断路器类),统计每次请求的结果并记录,根据结果判断是否开启断路器,自定义异常返回结果实现熔断降级。
2. 熔断和服务降级的区别
2.1 熔断:
- 原因:
- 服务提供者不可用
- 硬件故障:硬件损坏造成的服务器主机宕机, 网络硬件故障造成的服务提供者的不可访问
- 程序Bug:
- 缓存击穿:缓存击穿一般发生在缓存应用重启, 所有缓存被清空时,以及短时间内大量缓存失效时. 大量的缓存不命中, 使请求直击后端,造成服务提供者超负荷运行,引起服务不可用
- 用户大量请求:在秒杀和大促开始前,如果准备不充分,用户发起大量请求也会造成服务提供者的不可用
- 重试加大流量
- 用户重试:在服务提供者不可用后, 用户由于忍受不了界面上长时间的等待,而不断刷新页面甚至提交表单
- 代码逻辑重试: 服务调用端的会存在大量服务异常后的重试逻辑
- 服务调用者不可用
- 同步等待造成的资源耗尽:当服务调用者使用同步调用 时, 会产生大量的等待线程占用系统资源. 一旦线程资源被耗尽,服务调用者提供的服务也将处于不可用状态, 于是服务雪崩效应产生了。
- 解决方法
- 中断请求链
- 目的
- 保护了服务端,防止服务端由于负载较高导致一些机器宕机,并且由于机器减少而导致雪崩效应进而使得整个集群瘫痪的情况
- 服务提供者不可用
2.2 服务降级
- 原因
- 程序抛出异常
- 超时
- 解决方法
- 返回预定义好的固定的返回结果
- 目的
- 给客户端较好的体验而不是一堆异常栈。例如在秒杀系统中出现异常返回固定的排队页面。
3. 命令模式
命令模式有两个好处,
1:开闭原则
2:解耦调用者个被调用者
但开闭原则也带来了另一个问题类爆炸。例如,一个遥控器包含20种功能,传统的写法是一个遥控器类里面包含20中方法。如果用命令模式实现的话就是20个具体功能类,这样虽然每次新增新的功能只需要新增新的类而不需要修改原有的类,减少了错误的发生,但类也太多了。
hystrix实现命令模式的方式
注解:HystrixCommand,aop:HystrixCommandAspect
对于注解了HystrixCommand的类都会触发aop的methodsAnnotatedWithHystrixCommand方法,根据方法名,commandName等参数构造具体的命令对象。这样的好处有,1:解耦调用者和被调用者。2:资源隔离,根据commandName使用不同的线程池。