dubbo的 timeout 与 retries

一、问题描述:

dubbo消费者端向 dubbo 服务提供者端发起RPC远程调用,服务提供者端任务正常执行,但是却执行了3次。后来发现,虽然 provider 端程序正常执行,但是执行超时了,此时,consumer 端在超时前没有收到响应,就按照 dubbo 默认的重试机制一共调用了3次。
这种超时导致的重试,如果是读操作,影响倒是不大,但如果是写操作,会导致多次insert,应该避免这种问题。
由于我的项目中, provider 端是执行shell脚本,向服务器写文件,同时将执行日志与shell执行结果文件存到mysql,导致了多条写数据。

二、consumer 端报错信息:

六月 15, 2020 11:04:25 上午 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet [dispatcherServlet] in context with path [/tmp-web] threw exception [Request processing failed; nested exception is com.alibaba.dubbo.rpc.RpcException: Failed to invoke the method. Tried 3 times of the providers [172.x.x.x:7070] (1/1) from the registry 172.x.x.x:2181 on the consumer x.x.x.19 using the dubbo version 2.6.2. Last error is: Invoke remote method timeout.
provider: dubbo://172.x.x.x:7070/service.JmeterExecuteService?anyhost=true&application=tmp-web&dubbo=2.6.2&side=consumer&timeout=3000&version=1.0.0, cause: Waiting server-side response timeout.client elapsed: 0 ms, server elapsed: 3002 ms, timeout: 3000 ms, 

provider端日志的错误现象:虽然执行结果为true,但是由于超时,同一次调用重试了3次。

三、解决步骤:

1.取消重试。

关闭服务的重连,需要设置retries = -1 。
参考连接:【dubbo重试次数】
服务端接口配置

2.延长超时时间

以上操作发现,虽然dubbo的重试取消了,consumer 端只请求了一次,但是客户端日志却还是在报错,超时的异常依然存在,需要将超时时间设置长一点。
服务端接口配置
consumer 消费者端日志:
消费者端日志

provider 服务端日志:
服务端日志
问题解决了。注意:超时时间与重试的配置 是在provider端的,consumer端没有配置超时与重试参数。

四、dubbo 官网建议的配置优先级

以超时为例,这是从高到低的优先级(重试,负载平衡,活动对象也应用相同的规则):
方法级别,接口级别,默认/全局级别。
在同一级别上,消费者的优先级高于提供者
提供者方的配置通过注册表以URL的形式传递给消费者方。
在这里插入图片描述
建议提供者为每个服务设置一个超时,因为提供者确切地知道一种方法需要执行多长时间。如果使用者同时引用多个服务,则无需关心每个服务的超时设置。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值