springboot取消dubbo重试机制

背景

dubbo 服务默认配置了重试2次和超时时间,当服务处理超时或者网络问题导致服务响应超时,服务会被重复调用两次,这本来是为保证服务的质量,但是对于非幂等性接口就不太友好,重试导致接口被多次调用进行业务逻辑处理,会产生重复数据等问题。

方案

以下是取消dubbo重试机制的多种方式(网上一大堆是针对整个service的配置,都没有精确到某个方法,然而我们写接口都是按模块开发,只需要针对某个方法进行配置,并不想取消所有接口的重试机制,这里我会做为补充)

  1. 配置retries参数,设置重试次数为0
  • 整个service配置(如果设置retries=0没用可以试着改为retries=-1)
@Reference(version="1.0.0",retries = 0)
ITransferCircleService circleService;
  • 对单个方法
//引用
 @Reference(interfaceClass = ICircleService .class, retries =5, timeout = 5000, parameters = {
 			"addCircle.retries", "0", "addCircle.timeout", "5000",
            "addDiscuss.retries", "0", "addDiscuss.timeout", "5000"})
private ICircleService circleService;
//接口
public interface ICircleService{
    String addCircle(String code, long timeOutMillis);
     String addDiscuss(String code, long timeOutMillis);
}
  1. 设置集群的容错模式
/**
 * 设置 ICircleService  接口 容错模式为 failover,默认重试次数为5
 * 而单独设置 addCircle方法(非幂等)的 容错模式为快速失败
 */
@Reference(interfaceClass = ICircleService.class, cluster = "failover", retries = 5,
parameters = {"addCircle.cluster", "failfast"})
private ICircleService  circleService;
附上各种容错模式机制说明:
	
	Failover Cluster
	失败自动切换,当出现失败,重试其它服务器。(缺省)
	通常用于读操作,但重试会带来更长延迟。
	可通过retries="2"来设置重试次数(不含第一次)。
	
	Failfast Cluster
	快速失败,只发起一次调用,失败立即报错。
	通常用于非幂等性的写操作,比如新增记录。
	
	Failsafe Cluster
	失败安全,出现异常时,直接忽略。
	通常用于写入审计日志等操作。
	
	Failback Cluster
	失败自动恢复,后台记录失败请求,定时重发。
	通常用于消息通知操作。
	
	Forking Cluster
	并行调用多个服务器,只要一个成功即返回。
	通常用于实时性要求较高的读操作,但需要浪费更多服务资源。
	可通过forks="2"来设置最大并行数。
	
	Broadcast Cluster
	广播调用所有提供者,逐个调用,任意一台报错则报错。(2.1.0开始支持)
	通常用于通知所有提供者更新缓存或日志等本地资源信息。
  1. 增加服务调用的唯一标识
    客户端每次进行rpc调用前,生成唯一ID(UUID),传递到服务端
    服务端判断 以 UUID 为key在redis中是否存在,不存在 则可以执行正常逻辑;若存在,则认为是重试(重复调用)进行过滤操作。

  2. 在数据库设置唯一索引,保证接口幂等。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值