DUBBO timeout 请求超时问题

线上问题

同样的处理, 请求A,B,C都没问题, 只有C有问题,线上报以下错误,分析之后是因为dubbo 超时的问题,因为请求C的后台逻辑比较复杂,dubbo的消费端<dubbo:consumer timeout="5000" check="false"/>设置的超时时间太短的原因造成。

Failed to invoke the method getQyhx in the service com.zstimes.fpfx2.service.IFpfxOuterService.

Tried 3 times of the providers [192.168.100.57:20881] (1/1) from the registry 192.168.100.57:2181 on the consumer 192.168.100.74 using the dubbo version 2.8.4a. Last error is: Invoke remote method timeout. method: getQyhx, provider: dubbo://192.168.100.57:20881/com.zstimes.fpfx2.service.IFpfxOuterService?anyhost=true&application=zscloudweb-consumer&check=false&default.check=false&default.timeout=5000&dispatcher=all&dubbo=2.8.4a&generic=false&interface=com.zstimes.fpfx2.service.IFpfxOuterService&loadbalance=leastactive&methods=getQyhx&owner=zstimes&pid=8632&revision=1.0.0.10&side=consumer&timestamp=1528255020373&version=1.0.0, cause: Waiting server-side response timeout. start time: 2018-06-06 11:21:37.971, end time: 2018-06-06 11:21:42.978, client elapsed: 3 ms, server elapsed: 5001 ms, timeout: 5000 ms, request: Request [id=42, version=2.0.0, twoway=true, event=false, broken=false, data=RpcInvocation [methodName=getQyhx, parameterTypes=[class java.lang.String], arguments=[913204117724751963], attachments={path=com.zstimes.fpfx2.service.IFpfxOuterService, interface=com.zstimes.fpfx2.service.IFpfxOuterService, version=1.0.0, timeout=5000}]], channel: /192.168.100.74:60096 -> /192.168.100.57:20881


解决:

<dubbo:consumer timeout="20000" check="false"/>

dubbo的消费者配置问题件中 把timeout时间变大, 重新发布消费端。 解决问题。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Dubbo请求超时源码主要涉及到以下几个部分: 1. 超时参数的设置 在Dubbo中,请求超时时间可以通过`timeout`参数进行设置。该参数默认值为`1000`毫秒。在服务提供者和消费者端,Dubbo框架会通过`Invoker`接口的实现类`AbstractInvoker`来获取`timeout`参数的值,并将其转化为`long`类型的`timeout`属性。在`AbstractInvoker`的`invoke`方法中,会将`timeout`属性作为参数传递给`AsyncRpcResult`类的构造方法,以便在异步调用的过程中使用。 2. 请求超时的处理 在Dubbo中,请求超时的处理是通过`TimeoutFilter`过滤器实现的。该过滤器会对服务消费者发起的请求进行拦截,并在指定的时间内检查请求是否已经得到响应。如果请求超时,`TimeoutFilter`会抛出`RpcException`异常,并将异常信息返回给服务消费者。在`TimeoutFilter`的`invoke`方法中,首先会获取`timeout`属性的值,并将其转化为`long`类型的`timeout`变量。然后,通过`RpcContext`类的`isAsync`方法判断当前是否为异步调用。如果是异步调用,则会创建`TimeoutTask`类的实例,并将其提交到线程池中进行执行。`TimeoutTask`类的`run`方法中,会检查当前请求是否已经得到响应,如果超时则抛出`RpcException`异常。 在服务提供者端,Dubbo框架通过`Invoker`接口的实现类`AbstractInvoker`来获取`timeout`参数的值,并将其转化为`long`类型的`timeout`属性。在`AbstractInvoker`的`invoke`方法中,会将`timeout`属性作为参数传递给`RpcContext`类的`set`方法,并将`RpcContext`对象绑定到当前线程中。在服务提供者端,超时的处理主要是通过`RpcContext`类的`get`方法来判断当前请求是否已经超时。如果请求已经超时,则会抛出`RpcException`异常。 3. 超时时间的计算 在Dubbo中,超时时间的计算主要是通过`RpcContext`类的`get`和`set`方法实现的。在服务提供者端,Dubbo框架会在接收到请求后,通过`RpcContext`类的`set`方法将当前时间戳保存到`startTime`属性中。在服务消费者端,Dubbo框架会在发起请求之前,通过`RpcContext`类的`set`方法将当前时间戳保存到`requestTime`属性中。在`TimeoutFilter`过滤器中,会通过`RpcContext`类的`get`方法获取`requestTime`和`startTime`属性的值,并通过计算得到当前请求超时时间。同时,`TimeoutFilter`还会通过`RpcContext`类的`set`方法将当前请求超时时间保存到`timeout`属性中,以便在异步调用的过程中使用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值