精华内容
下载资源
问答
  • dubbo重试

    2021-04-21 22:13:36
  • springboot取消dubbo重试机制

    千次阅读 2019-05-21 14:56:36
    背景 dubbo 服务默认配置了重试2次和超时时间,当服务处理...以下是取消dubbo重试机制的多种方式(网上一大堆是针对整个service的配置,都没有精确到某个方法,然而我们写接口都是按模块开发,只需要针对某个方法进...

    背景

    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. 在数据库设置唯一索引,保证接口幂等。

    展开全文
  • Dubbo 重试机制 通过前面 Dubbo 服务发现&引用 的分析,我们知道,Dubbo重试机制是通过 com.alibaba.dubbo.rpc.cluster.support.FailoverClusterInvoker 来实现的: public Result doInvoke(Invocation ...

    Dubbo 重试机制

    通过前面 Dubbo 服务发现&引用 的分析,我们知道,Dubbo 的重试机制是通过 com.alibaba.dubbo.rpc.cluster.support.FailoverClusterInvoker 来实现的:

    public Result doInvoke(Invocation invocation, final List<Invoker<T>> invokers, LoadBalance loadbalance) throws RpcException {
        List<Invoker<T>> copyinvokers = invokers;
        checkInvokers(copyinvokers, invocation);
        // 默认重试 2 次
        int len = getUrl().getMethodParameter(invocation.getMethodName(), Constants.RETRIES_KEY, Constants.DEFAULT_RETRIES) + 1;
        if (len <= 0) {
            len = 1;
        }
        // retry loop.
        RpcException le = null; // last exception.
        List<Invoker<T>> invoked = new ArrayList<Invoker<T>>(copyinvokers.size()); // invoked invokers.
        Set<String> providers = new HashSet<String>(len);
        for (int i = 0; i < len; i++) {
            //Reselect before retry to avoid a change of candidate `invokers`.
            //NOTE: if `invokers` changed, then `invoked` also lose accuracy.
            if (i > 0) {
                checkWhetherDestroyed();
                copyinvokers = list(invocation);
                // check again
                checkInvokers(copyinvokers, invocation);
            }
            // 选择重试的 Invoker
            Invoker<T> invoker = select(loadbalance, invocation, copyinvokers, invoked);
            invoked.add(invoker);
            RpcContext.getContext().setInvokers((List) invoked);
            try {
                Result result = invoker.invoke(invocation);
                if (le != null && logger.isWarnEnabled()) {
                    logger.warn("Although retry the method " + invocation.getMethodName()
                            + " in the service " + getInterface().getName()
                            + " was successful by the provider " + invoker.getUrl().getAddress()
                            + ", but there have been failed providers " + providers
                            + " (" + providers.size() + "/" + copyinvokers.size()
                            + ") from the registry " + directory.getUrl().getAddress()
                            + " on the consumer " + NetUtils.getLocalHost()
                            + " using the dubbo version " + Version.getVersion() + ". Last error is: "
                            + le.getMessage(), le);
                }
                return result;
            } catch (RpcException e) {
                if (e.isBiz()) { // biz exception.
                    throw e;
                }
                le = e;
            } catch (Throwable e) {
                le = new RpcException(e.getMessage(), e);
            } finally {
                providers.add(invoker.getUrl().getAddress());
            }
        }
        throw new RpcException(le != null ? le.getCode() : 0, "Failed to invoke the method "
                + invocation.getMethodName() + " in the service " + getInterface().getName()
                + ". Tried " + len + " times of the providers " + providers
                + " (" + providers.size() + "/" + copyinvokers.size()
                + ") from the registry " + directory.getUrl().getAddress()
                + " on the consumer " + NetUtils.getLocalHost() + " using the dubbo version "
                + Version.getVersion() + ". Last error is: "
                + (le != null ? le.getMessage() : ""), le != null && le.getCause() != null ? le.getCause() : le);
    }

     

     

    查看源码我们可以发现,dubbo 默认的重试次数是 2 次,也就是说,为了容错性,如果第一次调用出异常(非业务异常)的话,Dubbo 会重试其他的 Invoker 2 次(具体的重试算法请查看源码),如果还是失败的话,就抛出 RpcException。所以默认情况下,服务最多被调用 3 次。

     

    注意:

    1. 这里的调用异常通常是指超时异常、网络异常等,具体可以查看 RpcException#isBiz() 方法

    2. 重试算法会优先重试 stickyInvoker,没有的话,会调用 LoadBalance 扩展来选择 Invoker。(具体实现请查看源码)

    转载于:https://www.cnblogs.com/kevin-yuan/p/10346570.html

    展开全文
  • dubbo重试机制

    2021-01-07 09:54:00
    spring.dubbo.consumer.retries=0 //表示重试1次 提供者: spring.dubbo.provider.retries=2 //表示重试2次 <!--消费者--> <dubbo:reference id="serviceid" interface="service" .

    默认是重试2次,加上初始一次,总共调用提供者3次;为了提高数据的幂等性,建议项目中取消重试配置;
    springboot+dubbo的配置如下
    消费者:
    spring.dubbo.consumer.retries=0 //表示重试1次
    提供者:
    spring.dubbo.provider.retries=2 //表示重试2次

     

    <!--消费者-->
    <dubbo:reference id="serviceid" interface="service"
                         retries="0"
                         timeout="1000"/>
    <!-- 生产者-->
    <dubbo:service interface="serviceid"
                       ref="service"
                       retries="0"
                       timeout="1000"/>

     

    展开全文
  • Dubbo重试次数

    千次阅读 2018-09-07 00:19:10
    重试次数 不配置,默认重试2次 不算第一个调用,一共会调用三次 参考文档 http://dubbo.apache.org/zh-cn/docs/user/references/xml/dubbo-consumer.html 轮询机制 相同的服务提供多份 比如 调用订单...
  • dubbo重试机制的坑

    2020-08-29 11:01:52
    默认是重试2次,加上初始一次,总共调用提供者3次;为了提高数据的幂等性,建议项目中取消重试配置;...spring.dubbo.consumer.retries=0 //表示重试1次 提供者: spring.dubbo.provider.retries=2 //表示重试2次 ...
  • dubbo服务为了正确性确实提供了重试服务,配置参数是:retries 和timeout 在consumer请求服务,在timeout时间内没有返回结果,dubbo会默认重试,默认retries =2,如果是数据插入会导致多条数据。如果考虑到返回结果...
  • dubbo重试机制

    万次阅读 2017-09-14 10:38:46
    dubbo重试机制
  • dubbo重试次数配置使用的是retries 属性。可以配置于服务提供者、消费者的接口方法、接口类、以及全局配置范围上。与超时配置优先级一样遵循就近原则,方法上的配置优先于接口类的,全局配置优先级最低。同级别的...
  • dubbo超时重试和异常处理
  • dubbo超时重试

    千次阅读 2018-01-29 11:29:20
    1.此截图来自官网http://dubbo.io,超时的配置关系如下,方法超时参数为findXxx.timeout,接口超时参数为timeout,全局配置超时参数为default.timeout,当提供端url有变动时这几个参数都会设置到url的参数中。...
  • dubbo超时重试导致数据重复

    千次阅读 2018-12-21 12:39:14
    后来debug时发现在发送邮件前,又执行了一次数据验证。...在网上找了很多资料,说是dubbo超时重试机制导致重新提交了注册,在将超时时间延长之后问题解决。  了解了一下dubbo超时重试机制: ... Dubbo的超时重试机...
  • 当消费者请求一个服务时出现错误,会重试连接其他的服务器,但重试会带来更多的延迟。重试次数可以使用【retries=重试次数】来设置。 1. 注解配置 在提供者中,reties的值设置在@Service中 在消费者中,reties的值...
  • Dubbo 的路由机制确保会将超时的请求路由到其他机器上,而不是本机重试,所以 Dubbo重试机制也能一定程度的保证服务的质量。 测试 我们先将服务提供者修改一下,故意让其超时,然后运行 producer 和 consumer 两...
  • Dubbo配置——重试次数

    千次阅读 2019-01-31 14:23:35
    重试次数 原因:当我们某一个服务,由于各种原因,比如:网络不佳,服务运行缓慢等,导致超时,远程方法调用失败,我们可以通过调整重试次数,让它多试上几次。 重试次数是一个整数,不包含第一次调用,0 代表不...
  • Dubbo超时重试机制带来的数据重复问题
  • yml设置dubbo超时、重试

    千次阅读 2018-08-24 17:40:41
    yml设置dubbo超时、重试 项目是基于springboot+dubbo。provider、conusme的配置并没有以xml形式。此处记录一下yml配置方法。 如果基于xml配置: &lt;dubbo:service timeout="4000" retries=&...
  • vo.setDeptName("xxx测试Dubbo超时数据插入重复"); deptProvider.saveDept(vo); long end = System.currentTimeMillis(); System.out.println("+++++++++++++++++耗时:"+(end-start)); resp.getWriter().write("++...
  • Dubbo 超时与重试的实现分析

    千次阅读 2018-05-31 14:30:53
    重试的实现当消费端发起一次调用,如果集群容错模式选择的是FailoverCluster模式(缺省模式),当调用发生失败会自动发起切换,重试其它服务器。&lt;dubbo:reference&gt; &lt;dubbo:method name="...
  • dubbo的超时是针对客户端的 超时的实现原理是什么? dubbo默认采用了netty做为网络组件,它属于一种NIO的模式。消费端发起远程请求后,线程不会阻塞等待服务端的返回,而是马上得到一个ResponseFuture,消费端通过...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,169
精华内容 8,067
关键字:

dubbo重试