dubbo异步调用 问题排查

本文详细记录了一次线上库存业务因Dubbo异步调用配置问题导致的数据校验失败,通过排查发现异步调用由RPC上下文中的async参数引起。在深入分析后,通过对dubbo provider过滤器的调整,解决了异步调用问题,恢复正常业务流程。

问题现象

10-26上午,收到同事反馈,线上库存执行业务不合法。
库存业务执行时,有时会反馈顶业数据或组织数据不合法。而实际数据是合法的。

问题排查过程

收到问题时,正在外地。
查看了同事发过来的异常请求的轨迹日志,发现库存业务执行时进行顶业或组织数据校验时,调用另外一个应用用户中心进行数据校验时,该应用返回null,导致校验不通过。反馈后转另外一个应用同事处理。(认为是另一个模块问题,未再关注)

下午4:30左右,收到电话,上午的问题还在(꒦_꒦),用户中心有数据返回,且下午做业务时,数据不合法基本上是必现了。查看了线上的日志。自己发请求(dubbo),请求用户中心的顶业校验服务,数据返回正常。

dubbo consumer数据解析异常了? 用arthas跟踪了一下库存业务调用用户服务的代码,发现确实没有返回数据。这个模块最近也没有修改过,why?

由于故障时间较长,下午基本是必现,影响到现场的作业。而昨天晚上做了一次系统发布。把库存所属应用做了一次版本回滚。
回滚后现场反馈作业正常,没有出现错误。
自身查了下代码,验证测试环境服务,未重现异常。现场作业完成后,晚上又重新把昨天发布的版本发布到线上。模拟现场做业务验证,未重现异常,一切ok。
why? 这下有点困惑了。

晚上重新分析了出错的请求日志和正常的请求日志,发现了一个关键点。调用用户中心服务返回null时,dubbo服务是异步调用执行的。查看了其他几次出错了,均是异步调用返回了null,导致校验不通过。
在这里插入图片描述
查看了今天库存所属应用对外发出的dubbo请求,上午异步、同步均有,下午有大量的异步请求,同步很少。这个和反馈的异常现象相吻合,由于异步导致了校验不通过。
但为什么会变成异步调用。dubbo consumer里面配置的是同步的。谁会来修改这个配置

27号上午现场又反馈昨天的问题重现了。分析了第一次异步调用的请求,是商品导入业务,去异步请求搜索中心接口。之后出现了顶业、组织、XX数据请求异步执行。搜索中心接口是异步执行的,但为什么其他同步接口会异步化。同事(xc,一起在排查)发了篇blog给我“Dubbo异步方法调用里有个坑”(https://blog.csdn.net/windrui/article/details/52150345)。看了下里面的问题现象、原因、解决方案,问题现象很像。看了下我们自身实现的dubbo provider过滤器,
Rpc上下文设置的时候,移除了了异步标识(上面blog中的解决方案),但后面又把invocation的附属参数信息设置进去了。debug调试的时候,看到里面有async:true的信息。
在这里插入图片描述
在这里插入图片描述

dubbo服务请求会从RPC上下文参数中取信息。而我们的服务,绝大部分都是默认的同步调用,没有显示设置 async:false,后续这个线程发起dubb服务调用时,会取到该线程RpcContext中的 async:true参数,故会变为异步调用。

Map<String, String> context = RpcContext.getContext().getAttachments();
if (context != null) {
invocation.addAttachmentsIfAbsent(context);
}
这里会把当前RpcContext中的attachments添加到调用ServiceB的RpcInvocation中,这时候async=true已经添加了,接着执行如下代码段,
if (getUrl().getMethodParameter(invocation.getMethodName(), Constants.ASYNC_KEY, false)){
invocation.setAttachment(Constants.ASYNC_KEY, Boolean.TRUE.toString());
}

上述代码修复后,问题解决,作业正常,后续未收到该问题反馈。

附属信息

我们使用的dubbo版本: 2.8.4

参考资料

dubbo异步方法调用里有个坑(https://blog.csdn.net/windrui/article/details/52150345)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值