dubbo超时的深思

在dubbo的provider和consumer的配置文件中,如果都配置了timeout的超时时间,dubbo默认以consumer中配置的时间为准

provider.xml的配置:

<dubbo:service timeout="4000" retries="0" interface="com.dingding.tms.bms.service.BillingZfbCodOrderService" ref="billingZfbCodOrderService" registry="globalRegistry"/>

conusmer中的配置:

<dubbo:reference id="billingInterService" interface="com.dingding.tms.bms.service.BillingInterService" protocol="dubbo" check="false" registry="globalRegistry" timeout="3000"/>

最后这个service在调用时的超时时间就是3秒

另外,

1,consumer会在超过3秒时得到一个调用超时的异常。

2,provider中代码的执行不会因为超时而中断,在执行完毕后,会得到一个dubbo的警告。

在Provider上尽量多配置Consumer端属性
原因如下:

  1. 作服务的提供者,比服务使用方更清楚服务性能参数,如调用的超时时间,合理的重试次数,等等
  2. 在Provider配置后,Consumer不配置则会使用Provider的配置值,即Provider配置可以作为Consumer的缺省值。否则,Consumer会使用Consumer端的全局设置,这对于Provider不可控的,并且往往是不合理的
  3. PS: 配置的覆盖规则:1) 方法级配置别优于接口级别,即小Scope优先 2) Consumer端配置 优于 Provider配置 优于 全局配置,最后是Dubbo Hard Code的配置值(见配置文档)

比如:
<dubbo:service interface="com.alibaba.hello.api.HelloService" version="1.0.0" ref="helloService"
    timeout="300" retry="2" loadbalance="random" actives="0"/>
 
< dubbo:service interface="com.alibaba.hello.api.WorldService" version="1.0.0" ref="helloService"
    timeout="300" retry="2" loadbalance="random" actives="0" >
    <dubbo:method name="findAllPerson" timeout="10000" retries="9" loadbalance="leastactive" actives="5" />
< dubbo:service/>

在Provider可以配置的Consumer端属性有:

  1. timeout,方法调用超时
  2. retries,失败重试次数,缺省是2(表示加上第一次调用,会调用3次)
  3. loadbalance,负载均衡算法(有多个Provider时,如何挑选Provider调用),缺省是随机(random)。还可以有轮训(roundrobin)、最不活跃优先(leastactive,指从Consumer端并发调用最好的Provider,可以减少的反应慢的Provider的调用,因为反应更容易累积并发的调用)
  4. actives,消费者端,最大并发调用限制,即当Consumer对一个服务的并发调用到上限后,新调用会Wait直到超时。在方法上配置(dubbo:method )则并发限制针对方法,在接口上配置(dubbo:service),则并发限制针对服务。

Provider上配置合理的Provider端属性
比如:

<dubbo:protocol threads="200" />
< dubbo:service interface="com.alibaba.hello.api.HelloService" version="1.0.0" ref="helloService"
    executes="200" >
    <dubbo:method name="findAllPerson" executes="50" />
< /dubbo:service>

Provider上可以配置的Provider端属性有:

  1. threads,服务线程池大小
  2. executes,一个服务提供者并行执行请求上限,即当Provider对一个服务的并发调用到上限后,新调用会Wait(Consumer可能到超时)。在方法上配置(dubbo:method )则并发限制针对方法,在接口上配置(dubbo:service),则并发限制针对服务。

以上为网上的定义,在实际使用中当服务的消费方调用服务的提供方超时时,会抛出如下异常:

Caused by: com.alibaba.dubbo.remoting.TimeoutException: Waiting server-side response timeout by scan timer. start time: 2016-07-20 16:27:34.873, end time: 2016-07-20 16:27:39.895, client elapsed: 0 ms, server elapsed: 5022 ms, timeout: 5000 ms, request: Request [id=438870, version=2.0.0, twoway=true, event=false, broken=false, data=RpcInvocation [methodName=querySeatByCode, parameterTypes=[class java.lang.String, class java.lang.String], arguments=[99925788, A1], attachments={input=356, path=com.dfire.soa.turtle.service.ISeatService, interface=com.dfire.soa.turtle.service.ISeatService, timeout=5000, version=1.0.0H5_pressuretest}]], channel: /10.1.5.128:34443 -> /10.1.5.172:20880

网上通常的解决办法是调大超时时间,但是也可能是因为代码本身有潜在问题而造成dubbo超时。

比如:在dubbo消费方,调用了dubbo的提供方,此时事务是分部的,但如果自己的service方法中会用到一张表并去做update操作导致产生了行锁时,如果恰巧你又在之后调用了另一个会操作此表的dubbo服务,那么问题就产生了,你会在调dubbo服务的时候发生如上的超时异常,就是因为用spring aop声明式事务,在你service没有执行完时产生的行锁并没有释放,而你又在service里放入了需要操作此表的dubbo服务,这样当数据库的死锁还没有抛异常的时候,dubbo就已经抛异常了,因此这个超时异常其实坑很深。

时间: 2024-10-23 12:06:28

dubbo超时的深思的相关文章

Dubbo超时和重连机制

摘要: dubbo启动时默认有重试机制和超时机制. 超时机制的规则是如果在一定的时间内,provider没有返回,则认为本次调用失败, 重试机制在出现调用失败时,会再次调用.如果在配置的调用次数内都失败,则认为此次请求异常,抛出异常. dubbo启动时默认有重试机制和超时机制.超时机制的规则是如果在一定的时间内,provider没有返回,则认为本次调用失败,重试机制在出现调用失败时,会再次调用.如果在配置的调用次数内都失败,则认为此次请求异常,抛出异常. 如果出现超时,通常是业务处理太慢,可在服

dubbo超时重试和异常处理

参考: https://www.cnblogs.com/ASPNET2008/p/7292472.html https://www.tuicool.com/articles/YfA3Ub https://www.cnblogs.com/binyue/p/5380322.html https://blog.csdn.net/mj158518/article/details/51228649 本篇主要记录dubbo中关于超时的常见问题,实现原理,解决的问题以及如何在服务降级中体现作用等. 超时问题

dubbo超时优先级设置

调用超时配置的优先级 可以在多个配置项设置超时,由上至下覆盖(即上面的优先),示例如下: # 其它的参数(retries.loadbalance.actives等)的覆盖策略也一样. 提供者端特定方法的配置 <dubbo:service interface="com.alibaba.xxx.XxxService" >     <dubbo:method name="findPerson" timeout="1000" />

dubbo服务调用超时问题解决方案

dubbo在调用服务不成功时,默认是会重试两次的.这样在服务端的处理时间超过了设定的超时时间时,就会有重复请求,比如在发邮件时,可能就会发出多份重复邮件,执行注册请求时,就会插入多条重复的注册数据,那么怎么解决超时问题呢?如下 1.对于核心的服务中心,去除dubbo超时重试机制,并重新评估设置超时时间. 2.业务处理代码必须放在服务端,客户端只做参数验证和服务调用,不涉及业务流程处理 当然Dubbo的重试机制其实是非常好的QOS保证,它的路由机制,是会帮你把超时的请求路由到其他机器上,而不是本机

关于dubbo服务产生异常之:Caused by: com.alibaba.dubbo.remoting.TimeoutException: Waiting server-side response timeout by scan timer.

简单来说就是dubbo超时,因为dubbo默认的时间是500ms,超过这个时间它会重新访问service层,最多尝试三次. 所以我在测试的时候日志显示出来的异常为……timeout……. 开始设置开始设置的timeout=50000,小数据量可以,如果数据量比较大就不行了. 后来在服务提供端设置timeout=1200000 <dubbo:service interface="com.XXXX.XXXXX.CardService" ref="cardService&qu

Dubbo面试踩坑

1.Dubbo支持哪些协议,每种协议的应用场景,优缺点? dubbo: 单一长连接和NIO异步通讯,适合大并发小数据量的服务调用,以及消费者远大于提供者.传输协议TCP,异步,Hessian序列化: rmi: 采用JDK标准的rmi协议实现,传输参数和返回参数对象需要实现Serializable接口,使用java标准序列化机制,使用阻塞式短连接,传输数据包大小混合,消费者和提供者个数差不多,可传文件,传输协议TCP. 多个短连接,TCP协议传输,同步传输,适用常规的远程服务调用和rmi互操作.在

com.alibaba.dubbo.rpc.RpcException和 com.alibaba.dubbo.remoting.TimeoutException

首先看具体报错的代码 一:检查服务是否配置 二:检查表现册配置  三:检查虚拟机防火墙是否关闭(一般不会是此问题)      四:查看数据库是否能正确连接 五:实体类没有实现序列化 六:注意到有这么一行报错代码   Waiting server-side response          就是响应超时的意思   那么在服务端很多因素都会影响   比如我们debugger服务端就可能造成这种原因(可以设置dubbo超时时间)         原文地址:https://www.cnblogs.co

为什么dubbo的调用重试不建议设置成超过1

前面提到过,重试是靠ClusterInvoker来保证的,不同的Cluster在调用失败的时候 做不同处理 比如默认的FailoverClusterInvoke的doInvoke方法里面:int len = getUrl().getMethodParameter(invocation.getMethodName(), Constants.RETRIES_KEY, Constants.DEFAULT_RETRIES) + 1;这个RETRIES_KEY就是重试次数,在后面的代码for (int i

有关dubbo面试的那些事儿

dubbo是什么 dubbo是一个分布式框架,远程服务调用的分布式框架,其核心部分包含: 集群容错:提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持. 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式. 自动发现:基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器. dubbo能做什么 透明化的远程方法调用,就像调用本