dubbo 的线程和连接模型 (长连接复用的两种形式)
来源:互联网 发布:快速背单词软件 编辑:程序博客网 时间:2024/06/05 00:43
本文业务表现博文:稳定性 耗时 监控原因分析-- dubbo rpc 框架 的线程池,io 连接模型. 客户端,服务端
原因剖析: 共用连接,出现了排队现象,所以慢了.需要打印 zipkin 日志.
把时间点传到下游,遇到耗时高的才打印日志. 或者各处自己打印日志. 后续日志预处理时多行转列.
dubbo 基于 netty,minnay.
以 netty 为基准 :
*分为连接层*处理层.
netty (nio ,nio2.0 )本身服务端的有多路复用的概念, 只是说 select 统一去轮训所有的连接.
dubbo 使用了长连接, 并且客户端使用了 长连接复用的概念. ( 一般服务端 用mysql 连接池 本身也是长连接,但是利用了连接池来复用长连接. )
当消费者的dubbo:reference中配置connections来单独增加消费者和服务提供者的TCP长连接的时候.
多个线程会同时向一个 tcp 通道发送数据, 异步等待数据回来,但是对调用者而言感觉又是同步的.
这种技术是通过异步来实现同步 (类似事件通知,nodejs) ,内部实现原理肯定需要将每个消息都标记一个消息 id , 异步返回的时候将 id 返回.
通过这个想法,去看源代码. 就找到了
HeaderExchangeChannel.request 方法里的 request 里的 mid. 和 DefaultFuture 一个类有什么作用不仅仅是看 field ,还要看 内部方法里使用的 类 ( 例如这里 Request 和 DefaultFuture )dubbo 的实体关系很复杂(一个实体又充当了不同的角色 channel 和 client 的双重角色,继承了两个接口) : HeaderExchangeChannel的作用(功能)就是 封装消息协议头,完成长连接复用的功能.
[ 画一副 dubbo 实体关系图, 1对多关系 , 启动关系, 执行关系 ,
Dubbo源码学习之知识点分析 和 续
http://blog.csdn.net/herriman/article/details/51525151 ,每个流程时的作用 ]对于客户端:
connects 配置, n 个线程可以共用一个连接 长连接共用
对于服务端:
可配置 accepts 和 threads
<dubbo:protocolname="dubbo"port="8888" threads="500"accepts="200"/>
本来dubbo 本身不需要线程池 [dubbo服务端基于 netty (netty 会有线程池,响应连接的请求)], 但由于客户端使用了长连接共用技术. 故 dubbo 本身需要在 netty 线程池的基础上,对 netty 线程 ----- 1对多 ---- 处理线程.
更深刻的理解:
同步基于异步实现
netty 本身是否有 mid 的概念
客户端长连接复用
服务端 nio 的连接复用概念 (多路复用概念)
由Dubbo consumer connections 配置 研究的连接数据实现
长连接并发使用的概念
长连接复用概念
连接池复用概念
nio多路复用概念
利用异步实现同步
- dubbo 的线程和连接模型 (长连接复用的两种形式)
- 长连接的两种方式
- JAVA连接数据库的两种形式-源代码
- PHP-MySQL连接的两种代码形式
- nodejs之mongoose连接数据库的两种形式
- 短连接和长连接的区分
- 长连接和短连接的区别
- HTTP的长连接和短连接
- HTTP的长连接和短连接
- HTTP的长连接和短连接
- HTTP的长连接和短连接
- HTTP的长连接和短连接
- HTTP的长连接和短连接
- HTTP的长连接和短连接
- HTTP的长连接和短连接
- TCP的长连接和短连接
- HTTP的长连接和短连接
- HTTP的长连接和短连接
- win10+py-faster-rcnn
- Android库包含库代码(非第三方库)
- Linux命令
- Spring 过源码
- Ubuntu 10.04下安装fcitx输入法
- dubbo 的线程和连接模型 (长连接复用的两种形式)
- JavaScript Window
- Map集合
- ASPEN Aspenone V8.0化工流程模拟软件送8G\
- 动态增加div,实现div之间的切换,不刷新页面
- 已知两个链表head1 和head2 各自有序,请把它们合并成一个链表依然有序。
- Android状态栏微技巧,带你真正理解沉浸式模式
- 内省
- Spring boot(二)