dubbo异步调用的坑

Posted 码上升华

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dubbo异步调用的坑相关的知识,希望对你有一定的参考价值。

一、前言

    最近版本发布了一个新版本,然后发现有个dubbo返回null了,仔细的排查了一下服务端的处理逻辑,不存在返回null的情况,而且同一个服务,其它地方调用正常,只有一个地方调用返回null,后来经询问下来,原来小伙伴在外层的服务调用加了async=true,好吧,掉坑了!瞬间闪过,难道外层的异步特性传递给了后续的调用,找资料核实了一下,还真是,有幸能踩到这个大坑我也就认了!


二、现象

原先正常调用的dubbo同步接口,突然返回null了


三、分析

原来的调用逻辑


小伙伴调整后,期望得到的处理效果

dubbo异步调用的坑

实际的效果

dubbo异步调用的坑

原来是com.alibaba.dubbo.rpc.protocol.AbstractInvoker的137,由于调用服务A时小伙伴加了async=true,此时时RpcContext.getContext().getAttachments()也包含async=true,所以这时invocation.setAttachment(Constants.ASYNC_KEY,Boolean.TRUE.toString()),然后服务A调用服务B时,RpcContext.getContext().getAttachments(),此时包含async=true,打算url本身async=false


而后续的处理RpcUtils.isAsync(getUrl(), invocation)为true,所以服务A调用服务B变成了异步处理


四、解决方案

修改一下dubbo的源码,打包发布解决!修改后如下图:

com.alibaba.dubbo.rpc.protocol.AbstractInvoker


希望对大家有帮助!

以上是关于dubbo异步调用的坑的主要内容,如果未能解决你的问题,请参考以下文章

Dubbo 同步调用太慢,也许你可以试试异步处理

Dubbo消费端同步调用异步调用(基于Dubbo3)

Dubbo异步调用源码解读和Bug分析

dubbo异步调用三种方式

Dubbo3高级特性「框架与服务」框架与服务的异步调用实践以及开发模式

手写dubbo-5rpc调用异步转同步