1.为什么使用Hystrix
在分布式环境中,不可避免会造成一些服务的失败。,Hystrix 提供延迟和容错功能,隔离远程系统、访问和第三方程序库的访问点,防止级联失败,保证复杂的分布系统在面临不可避免的失败时,仍能有其弹性。
线程组默认为10个线程,同时不接受任务排队。
Threads池的缺点:就是线程系统性能消耗。
Netflix 使用线程隔离方式每天处理100亿+次的服务调用,每个客户端节点上有40+个包含5-10个(最大10个)线程的线程池。下图是官方提供的一个每秒60次:
请求合并的作用域可以是全局作用域和Request作用域。
- 防止分布式系统中的级联故障
- 快速失败和快速恢复的能力
- 回退机制和优雅降级
- 为服务提供近实时的监控、预警和操作控制能力
2.Hello Hystrix
2.1.Hystrix与普通代码的使用区别
Hystrix的编程范式是基于命令模式,将行为和数据封装到继承自HystrixCommand的子类。
2.2 隔离策略
Hystrix采用bulkhead pattern去隔离不同服务的调用,同时控制他们的并发量。
Hystrix提供两种线程控制策略Threads、Semaphores。
Hystrix提供两种线程控制策略Threads、Semaphores。
Threads:
Hystrix使用相互隔离,预先准备的单独的线程组去执行任务命令。
Hystrix使用相互隔离,预先准备的单独的线程组去执行任务命令。
线程组默认为10个线程,同时不接受任务排队。
Threads池的优点(不多说了)。
Threads池的缺点:就是线程系统性能消耗。
Netflix 使用线程隔离方式每天处理100亿+次的服务调用,每个客户端节点上有40+个包含5-10个(最大10个)线程的线程池。下图是官方提供的一个每秒60次:
Semaphores:
使用信号量将基于宿主的线程去处理任务,因此不能提供提供超时处理,但能提供并发线程的上限控制。
设置配置 execution.isolation.strategy :SEMAPHORE 可开启该模式。
设置配置 execution.isolation.strategy :SEMAPHORE 可开启该模式。
2.3 请求合并
请求合并可以有效的降低网络连接次数。
请求合并的作用域可以是全局作用域和Request作用域。
请求合并的缺点:请求执行必须要等待某时间窗口的结束或达到合并处理的任务数量。
2.4 请求缓存
默认是开启请求缓存配置的,但必须重写getCacheKey()方法,并开启context(serlvet模式或者上下文模式HystrixRequestContext context = HystrixRequestContext.initializeContext();...shutdown())。
注意,缓存是只在单次request中生效。
注意,缓存是只在单次request中生效。
2.5 流程介绍
1 构造器,生成指令
可以extends两种指令父类,HystrixCommand / HystrixObservableCommand
2 执行指令
execute() — 阻塞,等待结果返回
queue() — 返回Future,execute()=queue().get()
observe() — 请求返回一个观察者,观察者需要注册行为监听器,处理返回结果
toObservable() — 返回一个延迟的观察者,在注册监听器的动作完成后才会触发请求。queue()=toObservable().toBlocking().toFuture()
3 判断缓存中是否已经有返回数据
4 判断断路器是否开启
如果开启,则进入步骤8,否则进入步骤5
可以extends两种指令父类,HystrixCommand / HystrixObservableCommand
2 执行指令
execute() — 阻塞,等待结果返回
queue() — 返回Future,execute()=queue().get()
observe() — 请求返回一个观察者,观察者需要注册行为监听器,处理返回结果
toObservable() — 返回一个延迟的观察者,在注册监听器的动作完成后才会触发请求。queue()=toObservable().toBlocking().toFuture()
3 判断缓存中是否已经有返回数据
4 判断断路器是否开启
如果开启,则进入步骤8,否则进入步骤5
5 判断Thread Pool/Queue/Semaphore 是否已满
如果并发量已满,则执行步骤8
6 执行
如果执行超时,Hystrix将会执行走向步骤8,并抛弃最终返回的结果。
如果执行结束,Hystrix会返回结果并提供日志和度量数据
7 计算回路健康度
Hystrix报告成功、失败、拒绝和超时的结果给断路器(circuit breaker),circuit breaker维护一个滚动的计数器计算统计数据。circuit breaker使用这些数据去决定是否将状态置为开启
8 执行fallback
4/5/6不满足以及超时都会进入fallback,实现HystrixCommand.getFallback()或HystrixObservableCommand.resumeWithFallback()
2 错误的比率超过阈值,默认是50%。
3 开启断路器,拒绝后续请求。
4 指定时间窗口过后,根据接下来的第一个请求的结果决定是否关闭断路器。
如果并发量已满,则执行步骤8
6 执行
如果执行超时,Hystrix将会执行走向步骤8,并抛弃最终返回的结果。
如果执行结束,Hystrix会返回结果并提供日志和度量数据
7 计算回路健康度
Hystrix报告成功、失败、拒绝和超时的结果给断路器(circuit breaker),circuit breaker维护一个滚动的计数器计算统计数据。circuit breaker使用这些数据去决定是否将状态置为开启
8 执行fallback
4/5/6不满足以及超时都会进入fallback,实现HystrixCommand.getFallback()或HystrixObservableCommand.resumeWithFallback()
2.6 断路器工作原理
1 访问的请求数大于阈值数,默认10秒内大于20次。2 错误的比率超过阈值,默认是50%。
3 开启断路器,拒绝后续请求。
4 指定时间窗口过后,根据接下来的第一个请求的结果决定是否关闭断路器。
2.7 配置方式
主要的几个配置参考类:HystrixCommandProperties,HystrixThreadPoolProperties,HystrixCommandMetrics.HealthCounts