作者回复: 你好,张申傲:非常 nice,你总结的非常到位,很有自己独到的见解,点赞~
作者回复: 你好,Six Days:【asyncContext.write(resultInfo); 】执行之后是将结果写入到了 Future 当中,但是还有另外一个底层在调用这个 Future#get 的结果,这个调用的地方就是在【org.apache.dubbo.remoting.exchange.support.header.HeaderExchangeHandler#handleRequest】方法中的【handler.reply(channel, msg);】代码处,【handler.reply(channel, msg);】返回的对象就是 Future 对象,然后调用 Future 对象的 whenComplete 方法,调用完后若没有结果就会等待,有结果的话就会立马进入 whenComplete 方法的回调逻辑中。
作者回复: 你好,在雨中:【async="true" sent="false"】结合起来就是异步形式,发送请求时并不会等待消息发送出去,而是将消费放入到队列中就完事了。至于后续要在消费方拿到结果的话,可以想办法从 RpcContext 中拿到 Future 对象并调用 Future#get 方法拿到返回值。
作者回复: 你好,张洋:你理解的没错,dubbo 在衔接上下文的时候,本质还是进行了 ThreadLocal 传递。
作者回复: 你好,java小霸王:这里为了简单理解,我抽象为了拦截处。等你学到后面的“发布、订阅、调用”章节的时候,掌握的知识点更多的时候,你通过断点的时候,你会发现 org.apache.dubbo.remoting.exchange.support.header.HeaderExchangeHandler#handleRequest 方法的 Future 对象在 whenComplete 方法中持有了 channel(即最终是 NettyClient)的引用。
作者回复: 你好,SunshineBoy:不好意思,主要是每篇篇幅有限,我给你找了一篇写的有点生活形象点的例子,附上链接如下: https://blog.csdn.net/lqy971966/article/details/118157808?spm=1001.2101.3001.6650.9&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-9-118157808-blog-100849453.pc_relevant_3mothn_strategy_and_data_recovery&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-9-118157808-blog-100849453.pc_relevant_3mothn_strategy_and_data_recovery&utm_relevant_index=10
作者回复: 你好,Geek_1cc6d1:这个问题在前面的问题回答过,我直接将内容引用过来了: 其次可以这么理解,提供方的异步化旨在提高吞吐量,说白了就是用自己的线程池去承处理业务,以此来释放Dubbo框架本身的线程去处理其他耗时比较短的请求,就有点类似于脏活累活交给一个特定的线程池让它自己扛,能扛多少是多少,既轻松又快的活Dubbo自己干,见缝插针似的尽可能提升提供方的整个吞吐。 最后如果是这种慢请求打到单机瓶颈了那还真得好好看看优化,如果是那种耗时非常短的请求打到单机瓶颈了,那你得后续考虑加大Dubbo本身线程核心数据或扩容或者有损限流降级等等之类的了。
作者回复: 你好,胡月:得先感谢你的认真思考,提出了个比较好的问题。 其次可以这么理解,提供方的异步化旨在提高吞吐量,说白了就是用自己的线程池去承处理业务,以此来释放Dubbo框架本身的线程去处理其他耗时比较短的请求,就有点类似于脏活累活交给一个特定的线程池让它自己扛,能扛多少是多少,既轻松又快的活Dubbo自己干,见缝插针似的尽可能提升提供方的整个吞吐。 最后如果是这种慢请求打到单机瓶颈了那还真得好好看看优化,如果是那种耗时非常短的请求打到单机瓶颈了,那你得后续考虑加大Dubbo本身线程核心数据或扩容或者有损限流降级等等之类的了。
作者回复: 你好,举个简单的例子:你通过 nio 写一个主线程接收,子线程处理并 write 响应,你可以看看,主线程是不是在等待子线程。 你把通信收发想象为400米接力赛,接力棒比喻为通信句柄,只要拿着接力棒就能说话,就能写数据,写完扔了释放就完事了。
作者回复: 你好,驽马一二三四五六七:感知到消息进来的是 netty 线程池,处理业务逻辑的,可以是 dubbo 业务线程池,也可以是 netty 自带的线程池。至于你说的问题,需要考虑使用的是什么Dispatcher类型。