《Spring Cloud 》Eureka服务调用服务超时重试机制

问题根源

问题根源有二:
1):业务耗时时间比较长,超过服务调用超时时间配置,由于Spring Cloud 服务调用超时重试机制默认开启,所以会导致服务被调用了两次。
2):服务端未做幂等性,导致重复的业务处理。

解决办法

增大配置超时时间
ribbon.ReadTimeout=10000
ribbon.ConnectTimeout=10000

附上spring Cloud 重试配置策略

eureka服务调用重试开关的配置属性:

spring.cloud.loadbalancer.retry.enabled =true

默认开启。


image.png

重试机制:对于连接超时的异常,feign都会触发重试机制,对于读取超时,会根据请求类型判断,如果是GET异常,触发重试;其他异常,不会触发重试。

ribbon.ReadTimeout=5000
ribbon.ConnectTimeout=2000

服务响应超时时间,默认5s,连接的超时时间为2s。

默认超时时间.jpg
ribbon.MaxAutoRetries=1

同一实例最大重试次数为1

ribbon.MaxAutoRetriesNextServer=2

负载均衡的其他实例的重试次数为2

ribbon.OkToRetryOnAllOperations=true

对所有操作请求都进行重试,默认false,建议不要开启。

当服务的某个节点出线故障时,在开启重试策略的情况下,ribbon负载均衡会根据上面的参数重新发起调用,重试机制确实能保证在单点故障的情况下服务能够正常使用。

但是如果因为不合理的超时时间配置或者业务处理时间比较久,超过配置的超时时间,而且服务器没有做幂等性操作,重试机制就可能带来灾难性的故障,所以要合理配置重试的参数。

你可能感兴趣的:(《Spring Cloud 》Eureka服务调用服务超时重试机制)