说到幂等性,大家应该并不陌生,幂等ID的过期时间如何设置呢?我们公司是基于Redis实现的幂等框架的,如果简单粗暴的话,可以设置为大于程序的执行时间,如果加上微服务的重试呢?以Spring Cloud各个组件去举例子,各个组件之间的关系是什么,在这里就不详细的解释了。
spring-cloud-feign之所以默认Retryer.NEVER_RETRY,即不重试,是因为spring-cloud-feign整合了ribbon,ribbon也有重试策略,如果fegin也开启重试策略,容易造成混乱。
见FeignClientProperties源码:
我们没有配置feign的超时时间,使用ribbon的超时时间。如果配置了feign的就以feign为主。
ribbon默认开启重试(除了配置项, 还需要加入spring-retry):
判断isOkToRetryOnAllOperations=true(默认值为false)时, 返回RetryHandler实现
来看下RequestSpecificRetryHandler构造函数中的几个参数
备注:默认情况下,GET方式请求无论是连接异常还是读取异常,都会进行重试;非GET方式请求,只有连接异常时,才会进行重试。
ribbon.MaxAutoRetries (在同一个Server上重试的次数)默认为0, ribbon.MaxAutoRetriesNextServer(重试下一个Server的次数) 默认值为1.
也就是:RetryCount= (maxAutoRetries + 1) * (maxAutoRetriesNextServer + 1)-1
建议幂等ID的过期时间最小设置为:(connectTimeOut+readTimeOut+重试间隔时间)* 请求次数+程序执行时间。
备注:重试间隔时间默认1s,在指定multiplier(指定延迟倍数)为0的情况下。
分割线:说点晚上和一个朋友的聊天几个问题和感受:
最近我也在系统化的梳理业务和自己的技术,不要再碎片化了。希望我能跟上你的节奏!我们的征途是星辰大海!