sofastack / sofa-rpc

SOFARPC is a high-performance, high-extensibility, production-level Java RPC framework.
https://www.sofastack.tech/sofa-rpc/docs/Home
Apache License 2.0
3.81k stars 1.17k forks source link

关于bolt 传输层实现中的连接池管理的一点疑问? #464

Closed wind-clothes closed 5 years ago

wind-clothes commented 5 years ago

com.alipay.sofa.rpc.transport.bolt.BoltClientConnectionManager 中的urlConnectionMap 与connectionRefCounter的作用是什么,然后就是它的连接池管理是由哪个实现的?

leizhiyuan commented 5 years ago

image

这两个作用不一样,一个是计数。

连接池在这里:com.alipay.sofa.rpc.client.AllConnectConnectionHolder

wind-clothes commented 5 years ago

1、这几个字段标注了@VisibleForTesting 代表什么意思; 2、BoltClientTransport 建立连接的时候是去从BoltClientConnectionManager获取,然后先从urlConnectionMap获取,获取不到才去RpcClient中bolt设置的默认DefaultConnectionManager 连接池管理器获取链接,AllConnectConnectionHolder & BoltClientConnectionManager & DefaultConnectionManager他们的层次关系是什么样的?

抱歉,一个小白,第一次学习Rpc,望指点。

leizhiyuan commented 5 years ago

@VisibleForTesting 表示为了测试用例可见,所以没有设置为private 这些建议先看下这里的介绍 http://www.sofastack.tech/post/hnppce 然后对应看下代码。

wind-clothes commented 5 years ago

你们发表的所有文档我都看了,就是这几个模块AllConnectConnectionHolder & BoltClientConnectionManager & DefaultConnectionManager 之间不是很清楚,如果AllConnectConnectionHolder连接池实现在这块,那BoltClientConnectionManager & DefaultConnectionManager 这两个连接池管理器的作用是什么?

leizhiyuan commented 5 years ago

AllConnectConnectionHolder 是通用的连接管理,支持bolt/http等等。在收到地址后,会调用不同的ClientTransport,比如对于bolt的服务。BoltClientTransport 里面的BoltClientConnectionManager ,调用bolt底层的DefaultConnectionManager 来创建连接。

BoltClientConnectionManager 是针对为了bolt协议,做的连接复用的管理。主要是为了 当 长连接复用时,共享长连接的连接池,一个服务端ip和端口同一协议只建立一个长连接,不管多少接口,共用长连接

DefaultConnectionManager 是底层bolt 自己维护的长连接。 但是bolt底层通信的长连接,