why哥这里有一道Dubbo高频面试题,请查收。 (3)

简介: why哥这里有一道Dubbo高频面试题,请查收。 (3)

有的小伙伴就要问了:这里怎么能是阻塞式的无限等待呢?接口调用不是有超时时间吗?


注意了,这里并不是无限等待。Dubbo 会保证当接口不管是否超时,都会有一个 Runable 的任务被扔到队列里面。所以 take 这里最多也就是等待超时时间这么长时间。


先记着这里,下面会给大家讲到超时检测的逻辑。


看到这里,我们已经和官网上的回答产生一点联系了,我再给大家捋一捋我们现在有的东西:


第一点:用户线程在 AsyncToSyncInvoker 类里面调用了下面这个方法,在等结果。代码和官网上的描述的对应关系如下:


image.png


官网上说:会调用不同 DefaultFuture 对象的 get 方法进行等待,这应该是 2.6.x 版本的做法了。


在 2.7.5 版本中是在 AsyncRpcResult 对象的 get 方法中进行等待。而在该方法中,其实是调用了队列的 take 方法,阻塞等待。


在这两个不同对象上的等待是两种完全不同的实现方式。2.7.5 版本里面这样做也是为了做客户端的共享线程池。实现起来优雅了很多,大家可以拿着两个版本的代码自行比较一下,理解到他的设计思路之后觉得真的是妙啊。


但是不论哪个版本,万变不离其宗,请求发出去后,还是需要在用户线程等待。


第二点:发送 request 对象之前构建了一个 DefaultFuture 对象。在这个对象里面维护了一个静态 MAP:


image.png


有了调用编号和 DefaultFuture 对象的映射关系。等收到 Response 响应之后,我们从 Response 中取出这个调用编号,就知道这个调用编号对应的是哪个 DefaultFuture 了,妙啊。


但是,等等。“从 Response 中取出这个调用编号”,那不是意外着我们得把调用编号送到服务端去?在哪送的?


答案是在协议里面,还记得上一篇文章中讲协议的时候里面也有个调用编号吗?


image.png


呼应上了没有?


每个请求和响应的 header 里面都有一个请求编号,这个编号是一一对应的,这是协议规定好的。


在发送 request 之前,对其进行 encode 的时候写进去的:


org.apache.dubbo.remoting.exchange.codec.ExchangeCodec#encodeRequest


image.png


image.png



就等着响应了。


接收响应,寻找请求


请求发出去是一件很简单的事情。


但是作为响应回来之后就懵逼。一个响应回来了,找不到是谁发起的它,你说它难受不难受?难受就算了,你就不怕它随便找一个请求就返回了,当场让你懵逼。


你说响应消息是在哪儿处理的?


上篇文章专门讲过哈,说不知道的都是假粉丝:


org.apache.dubbo.rpc.protocol.dubbo.DubboCodec#decodeBody


网络异常,图片无法展示
|


你看上门代码截图的第 66 行:get request id(获取请求编号)。


从哪里获取?



从 header 中获取。


header 中的请求编号是哪里来的?


发起 request 请求的时候,从 request 对象中取出来写到协议里面的。


request 对象中的请求编号是哪里来的?


通过 AtomicLong 从 0 开始自增来的。


好了,知道这个 id 是怎么来的了,也获取到了。它是在哪里用的呢?


org.apache.dubbo.remoting.exchange.support.DefaultFuture#received(org.apache.dubbo.remoting.Channel, org.apache.dubbo.remoting.exchange.Response, boolean)


image.png




目录
相关文章
|
7月前
|
负载均衡 Dubbo Java
Dubbo面试题
Dubbo面试题
66 0
|
7月前
|
自然语言处理 Dubbo Java
【面试问题】Dubbo 推荐用什么协议?
【1月更文挑战第27天】【面试问题】Dubbo 推荐用什么协议?
|
6月前
|
负载均衡 Dubbo 安全
dubbo面试题收集
dubbo面试题收集
|
6月前
|
负载均衡 Dubbo 安全
dubbo面试题库
dubbo面试题库
|
6月前
|
负载均衡 Dubbo Java
哈啰面试:说说Dubbo运行原理?
哈啰面试:说说Dubbo运行原理?
52 0
哈啰面试:说说Dubbo运行原理?
|
6月前
|
缓存 NoSQL 数据库
分布式系统面试全集通第一篇(dubbo+redis+zookeeper----分布式+CAP+BASE+分布式事务+分布式锁)
分布式系统面试全集通第一篇(dubbo+redis+zookeeper----分布式+CAP+BASE+分布式事务+分布式锁)
109 0
|
Dubbo Java 应用服务中间件
Dubbo第二讲:深入理解dubbo分布式服务框架/负载/容错/调优/高可用/dubbo网关/面试/技术选型
Dubbo第二讲:深入理解dubbo分布式服务框架/负载/容错/调优/高可用/dubbo网关/面试/技术选型
309 0
|
7月前
|
监控 负载均衡 Dubbo
Dubbo 面试题及答案整理,最新面试题
Dubbo 面试题及答案整理,最新面试题
151 1
|
7月前
|
XML Dubbo Java
【面试问题】Dubbo 的整体架构设计有哪些分层?
【1月更文挑战第27天】【面试问题】Dubbo 的整体架构设计有哪些分层?