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

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

标号为 ① 的地方就是根据 response 里面的 id,即调用编号从 FUTURES 这个 MAP 中移除并获取出对应的请求。


如果获取到的请求是 null,说明超时了。


如果获取到的请求不为 null,则判断是否超时了。超时逻辑我们最后再讲。


标号为 ② 地方是要把响应返回给对应的用户线程了。


在 doReceived 里面使用了响应式编程:


image.png


这的 this 就是当前类,即 DefaultFuture。


那么这个 doReceived 方法是怎么调到这里的呢?


image.png


之前的文章说过 Dubbo 默认的派发策略是 ALL,所以所有的响应都会被派发到客户端线程池里面去,也就是这个地方:


当接收到服务端的响应后,响应事件也会被扔到线程池里面,从代码中可以看到,扔进去的就是一个 Runable 任务。


然后执行了 execute 方法,这个方法就和上一小节讲请求的地方呼应上了。


还记得我们的请求是调用了 queue.take 方法,进入阻塞等待吗?


而这里就是在往 queue 里面添加任务。


image.png


队列里面有任务啦!在阻塞等待的用户线程就活过来了!


接下来用户线程怎么执行?


看代码:


image.png


取到任务后执行了任务的 run 方法。注意是 run 方法哦,并不会起新的线程。


而这个任务是什么任务?


image.png


image.png


上周的文章也说到了这个方法。


而 handler.received 方法最终就会调用到我们前说的 doReceived 方法:


image.png


这里返回的 Result 就是最终的服务端返回的数据了,或者是返回的异常。


现在你再回过头去看官网这张图,应该就能看明白了:


image.png


超时检查


前面说 newFuture 的时候不是说它还干了一件事就是检测是否超时嘛。其实原理也是很简单:


image.png


首先有一个 TimeoutCheckTask 类,这是一个待执行的任务。


image.png


触发后会根据调用编号去 FUTURES 里面取 DefaultFuture。


前面我刚刚说了:如果一个 future 正常完成之后,会从 FUTURES 里面移除掉。


那么如果到点了,根据编号没有取到 Future 或者取到的这个 Future 的状态是 done 了,则说明这个请求没有超时。


如果这个 Future 还在 FUTURES 里面,含义就是到点了你咋还在里面呢?那肯定是超时了,调用 notifyTimeout 方法,是否超时参数给 true:


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 的整体架构设计有哪些分层?