没想到吧!关于Dubbo的『消费端线程池模型』官网也写错了。 (5)

简介: 没想到吧!关于Dubbo的『消费端线程池模型』官网也写错了。 (5)

你仔细看着两个版本之间的代码,发现一模一样,也没有差异啊。


这就把我干懵逼了:咋回事?说好的差异呢?


别忘了,上面的代码里面是有一个变量的:


image.png


image.png


换句话说就是:2.7.5 版本之前,业务数据返回后,默认在 IO 线程里面进行反序列化的操作。而2.7.5 版本之后,默认是延迟到客户端线程池里面进行反序列化的操作。


(建议朗读并背诵)


同时这个参数,不管在哪个版本里面,都是可以配置。虽然基本上也没有人更改过这个配置,配置方法如下:


image.png


朋友们,到这里还跟的上不?跟不上你就再捋捋?别硬看,伤身体。


解码操作源码解析


接下来我们再看看解码操作的代码到底是怎么样的。


首先解码操作,解的什么码?



解的是响应报文的响应体,也就是我们的返回内容:

org.apache.dubbo.rpc.protocol.dubbo.DecodeableRpcResult#decode(org.apache.dubbo.remoting.Channel, java.io.InputStream)


微信图片_20220426211809.png


image.png


image.png


image.png


因为 IO 线程和客户端线程池都要调用这个方法进行解码,我们总不能解码两次吧,那怎么保证只解码一次呢?


答案就是设置标识位。


因为我们知道如果是在 IO 线程里面解码,那么该操作调用解码方法后,肯定是先于客户端线程池调用的。


有先后顺序就好办了。我们就可以设置标识位:


image.png


image.png


image.png


这样也解释了,为什么说是“延迟”到客户端线程池里面解码。


好了,到这里你有没有发现一个问题。前面解析的这么多源码,然后咔一下,直接我们就看到了最终返回的“Hello why”了。


这个是响应消息体,是 body。


头呢?header 呢?


image.png


别急,这不是马上就给你讲一下嘛。


前面讲这个方法的时候说了:header 是作为参数传进来的嘛,那我们还可以去找一下 header 到底是怎么传进来的:


image.png


怎么看呢?

顺着调用链往回找就行,一个调试小技巧,送给大家,不客气:


image.png


可以看到 header 是从 buffer 里面取出来的,最多读

取 HEADER_LENGTH (16) 个字节。


什么?你还问我为什么最多读 16 个字节?


我怀疑前面讲协议的时候你就在走神。别问,问就是协议规

定。大家遵守就好了。


再跟着调用链往前一步,你会发现这里主要是在做解码响应头的部分:


image.png





目录
相关文章
|
19天前
|
存储 缓存 关系型数据库
MySQL底层概述—3.InnoDB线程模型
InnoDB存储引擎采用多线程模型,包含多个后台线程以处理不同任务。主要线程包括:IO Thread负责读写数据页和日志;Purge Thread回收已提交事务的undo日志;Page Cleaner Thread刷新脏页并清理redo日志;Master Thread调度其他线程,定时刷新脏页、回收undo日志、写入redo日志和合并写缓冲。各线程协同工作,确保数据一致性和高效性能。
MySQL底层概述—3.InnoDB线程模型
|
7月前
|
编解码 网络协议 API
Netty运行原理问题之Netty的主次Reactor多线程模型工作的问题如何解决
Netty运行原理问题之Netty的主次Reactor多线程模型工作的问题如何解决
|
5月前
|
并行计算 JavaScript 前端开发
单线程模型
【10月更文挑战第15天】
|
5月前
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
48 1
|
6月前
|
消息中间件 存储 NoSQL
剖析 Redis List 消息队列的三种消费线程模型
Redis 列表(List)是一种简单的字符串列表,它的底层实现是一个双向链表。 生产环境,很多公司都将 Redis 列表应用于轻量级消息队列 。这篇文章,我们聊聊如何使用 List 命令实现消息队列的功能以及剖析消费者线程模型 。
142 20
剖析 Redis List 消息队列的三种消费线程模型
|
5月前
|
NoSQL Redis 数据库
Redis单线程模型 redis 为什么是单线程?为什么 redis 单线程效率还能那么高,速度还能特别快
本文解释了Redis为什么采用单线程模型,以及为什么Redis单线程模型的效率和速度依然可以非常高,主要原因包括Redis操作主要访问内存、核心操作简单、单线程避免了线程竞争开销,以及使用了IO多路复用机制epoll。
90 0
Redis单线程模型 redis 为什么是单线程?为什么 redis 单线程效率还能那么高,速度还能特别快
|
5月前
|
安全 调度 C#
STA模型、同步上下文和多线程、异步调度
【10月更文挑战第19天】本文介绍了 STA 模型、同步上下文和多线程、异步调度的概念及其优缺点。STA 模型适用于单线程环境,确保资源访问的顺序性;同步上下文和多线程提高了程序的并发性和响应性,但增加了复杂性;异步调度提升了程序的响应性和资源利用率,但也带来了编程复杂性和错误处理的挑战。选择合适的模型需根据具体应用场景和需求进行权衡。
|
5月前
|
消息中间件 NoSQL 关系型数据库
【多线程-从零开始-捌】阻塞队列,消费者生产者模型
【多线程-从零开始-捌】阻塞队列,消费者生产者模型
72 0
|
8月前
|
缓存 编译器 Go
开发与运维线程问题之Go语言的goroutine基于线程模型实现如何解决
开发与运维线程问题之Go语言的goroutine基于线程模型实现如何解决
70 3
|
8月前
|
算法 调度 人工智能
人工智能线程问题之无锁化编程如何解决
人工智能线程问题之无锁化编程如何解决
72 2