源码分析Hystrix降级策略和调整
Ribbo设置超时时间大于服务调用时间还是发回退异常问题:
先看一下服务调用图,订单服务下单调用商品服务,但可能还会调用用户服务,此时商品服务那边可能需要查看商品信息各种复杂操作,用户服务还需要判断此用户是不是作弊用户。这些操作加起来可能有两秒钟,此时就出现问题了,订单服务设置了连接超时,就会返回回退语句,并且发送短信等操作
前一章的熔断实战,模拟了线程睡眠超时2秒,但尽管修改了Fegin里的ribbon超时时间为4秒还是会返回回退。所以光靠ribbo里的超时是不行的,因为使用了hystrix里的超时策略
官方文档:https://github.com/Netflix/Hystrix/wiki/Configuration#execution.isolation.strategy
1.查看默认讲解策略 HystrixCommandProperties
以下是常用的超时策略,更多的去官方文档
1)execution.isolation.strategy 隔离策略
THREAD 线程池隔离(默认)
比如一个请求调用4服务,1000个请求,每个请求个站250个 即使有一个服务有问题,还有750个可用
SEMAPHORE 信号量
信号量适用于接口并发量高的情况,如每秒千次调用的情况,导致线程开销过高,通常只适用 于非网络调用,执行速度快
2)execution.isolation.thred.timeoutInMilliseconds 超时时间默认为1秒
就是这里的设置才导致Ribbon即使修改了也不会起作用,调用一个服务超过一秒,hystrix就会断定降级处理返回fallback处理
3)execution.timeout.enable 是否开启超时限制
可以关闭hystrix的超时,但任何一个服务都不能把时间限制关闭,可以设置超时时间长一些
4)execution.isolation.semaphore.maxConcurrentRequests
隔离策略为信号量的时候,如果达到最大并发数时,后续请求会被拒绝,默认是10
2.调整策略
方式一:可以直接加在fallbackMehod方法后,但这种方式不友好
@HystrixCommand(fallbackMethod = "saveObjectFail",commandProperties = {
@HystrixProperty(name = "",value = "")
})
方式二:配置文件修改
#禁用Hystrix超时策略
#hystrix:
# command:
# defalut: #default全局有效,service id指定应用有效
# execution:
# timeout:
# #如果enabled设置为false,则请求超时交给ribbon控制,为true,则超时作为熔断根据
# enabled: false
设置execution.isolation.thred.timeoutInMilliseconds超时时间
#设置Hystrix服务连接超时时间
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 4000