当前位置: 首页>编程语言>正文

dubbo spi加载路径 dubbo.provider.threads

一、问题描述:

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次。

dubbo spi加载路径 dubbo.provider.threads,dubbo spi加载路径 dubbo.provider.threads_优先级,第1张

三、解决步骤:

1.取消重试。

关闭服务的重连,需要设置retries = -1 。

参考连接:【dubbo重试次数】

dubbo spi加载路径 dubbo.provider.threads,dubbo spi加载路径 dubbo.provider.threads_优先级_02,第2张

2.延长超时时间

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

dubbo spi加载路径 dubbo.provider.threads,dubbo spi加载路径 dubbo.provider.threads_ide_03,第3张

consumer 消费者端日志:

dubbo spi加载路径 dubbo.provider.threads,dubbo spi加载路径 dubbo.provider.threads_优先级_04,第4张

provider 服务端日志:

dubbo spi加载路径 dubbo.provider.threads,dubbo spi加载路径 dubbo.provider.threads_dubbo spi加载路径_05,第5张

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

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

以超时为例,这是从高到低的优先级(重试,负载平衡,活动对象也应用相同的规则):

方法级别,接口级别,默认/全局级别。

在同一级别上,消费者的优先级高于提供者

提供者方的配置通过注册表以URL的形式传递给消费者方。

dubbo spi加载路径 dubbo.provider.threads,dubbo spi加载路径 dubbo.provider.threads_优先级_06,第6张

建议提供者为每个服务设置一个超时,因为提供者确切地知道一种方法需要执行多长时间。如果使用者同时引用多个服务,则无需关心每个服务的超时设置。


https://www.xamrdz.com/lan/56f1935568.html

相关文章: