标签:清理 lan 拒绝 配置 man 依赖 img 级联 额外
一、hystrix的作用
二、hystrix实现中需要注意的点
三、hystrix线程模型
四、hystrix执行流程(工作机理)
附:清晰大图
步骤:(配合上图去看)
1、构建HystrixCommand或者HystrixObservableCommand对象
2、执行命令(execute()、queue()、observe())
3、如果请求结果缓存这个特性被启用,并且缓存命中,则缓存的回应会立即通过一个 Observable
对象的形式返回。
4、检查熔断器状态,确定请求线路是否是开路,如果请求线路是开路,Hystrix 将不会执行这个命令,而是直接使用『失败回退逻辑』(即不会执行run(),直接执行getFallback())
5、如果和当前需要执行的命令相关联的线程池和请求队列(或者信号量,如果不使用线程池)满了,Hystrix 将不会执行这个命令,而是直接使用『失败回退逻辑』(即不会执行run(),直接执行getFallback())
6、执行HystrixCommand.run()或HystrixObservableCommand.construct(),如果这两个方法执行超时或者执行失败,则执行getFallback();如果正常结束,Hystrix 在添加一些日志和监控数据采集之后,直接返回
回应
7、Hystrix 会将请求成功,失败,被拒绝或超时信息报告给熔断器,熔断器维护一些用于统计数据用的计数器。
这些计数器产生的统计数据使得熔断器在特定的时刻,能短路某个依赖服务的后续请求,直到恢复期结束,若恢复期结束根据统计数据熔断器判定线路仍然未恢复健康,熔断器会再次关闭线路。
五、熔断器执行流程(工作机理)
附:清晰大图
1、假设线路内的容量(请求QPS)达到一定阈值(通过 HystrixCommandProperties.circuitBreakerRequestVolumeThreshold()
配置),同时,假设线路内的错误率达到一定阈值(通过 HystrixCommandProperties.circuitBreakerErrorThresholdPercentage()
配置)
2、熔断器将从『闭路』转换成『开路』
3、若此时是『开路』状态,熔断器将短路后续所有经过该熔断器的请求,这些请求直接走『失败回退逻辑』(即不走run(),直接走getFallback())
4、经过一定时间(即『休眠窗口』,通过 HystrixCommandProperties.circuitBreakerSleepWindowInMilliseconds()
配置),后续第一个请求将会被允许通过熔断器(此时熔断器处于『半开』状态),若该请求失败,熔断器将又进入『开路』状态,且在休眠窗口内保持此状态;若该请求成功,熔断器将进入『闭路』状态,回到逻辑1循环往复。
六、线程池与信号量
使用场景:对于那些本来延迟就比较小的请求(例如访问本地缓存成功率很高的请求)来说,线程池带来的开销是非常高的,这时,你可以考虑采用其他方法,例如非阻塞信号量(不支持超时),来实现依赖服务的隔离,使用信号量的开销很小。但绝大多数情况下,Netflix 更偏向于使用线程池来隔离依赖服务,因为其带来的额外开销可以接受,并且能支持包括超时在内的所有功能。
如果你对客户端库有足够的信任(延迟不会过高),并且你只需要控制系统负载,那么你可以使用信号量。
七、请求合并
参考:
https://github.com/Netflix/Hystrix/wiki
http://youdang.github.io/categories/%E7%BF%BB%E8%AF%91/ 对官网翻译的非常好,可惜没有翻译完
标签:清理 lan 拒绝 配置 man 依赖 img 级联 额外
原文地址:http://www.cnblogs.com/sunny3096/p/7160181.html