问题根源
问题根源有二:
1):业务耗时时间比较长,超过服务调用超时时间配置,由于Spring Cloud 服务调用超时重试机制默认开启,所以会导致服务被调用了两次。
2):服务端未做幂等性,导致重复的业务处理。
解决办法
增大配置超时时间
ribbon.ReadTimeout=10000
ribbon.ConnectTimeout=10000
附上spring Cloud 重试配置策略
eureka服务调用重试开关的配置属性:
spring.cloud.loadbalancer.retry.enabled =true
默认开启。
重试机制:对于连接超时的异常,feign都会触发重试机制,对于读取超时,会根据请求类型判断,如果是GET异常,触发重试;其他异常,不会触发重试。
ribbon.ReadTimeout=5000
ribbon.ConnectTimeout=2000
服务响应超时时间,默认5s,连接的超时时间为2s。
ribbon.MaxAutoRetries=1
同一实例最大重试次数为1
ribbon.MaxAutoRetriesNextServer=2
负载均衡的其他实例的重试次数为2
ribbon.OkToRetryOnAllOperations=true
对所有操作请求都进行重试,默认false,建议不要开启。