weibocom / motan

A cross-language remote procedure call(RPC) framework for rapid development of high performance distributed services.
Other
5.89k stars 1.78k forks source link

为什么要把nettyclient池化呢? #412

Open hanzhihua opened 7 years ago

hanzhihua commented 7 years ago

为什么要对nettyclient做连接池化,不可以共享一个或者几个nettyclient呢 netty channel本来就是异步化的,可以共享的

rayzhang0603 commented 7 years ago

做链接池主要是为了进行链接的动态管理。不可否认池化会对性能有一定影响,但是比自己动态控制链接要简便很多,在动态多链接场景下请求的长尾会比较小。 如果对client端吞吐量有非常高的要求可以考虑对这部分进行修改。后续开发netty4版本时可能会在此做一定优化。

hanzhihua commented 7 years ago

谢谢你的及时回复,我有以下几个疑惑? 采用连接池的方式,会造成block在从连接池中取资源的地方,而且真的需要那么多个长链接通道吗? 多链接通道的性能真的比单个链接通道就要性能高吗? dubbo默认是一个链接通道,当然可以配置多个,但它的通道是共享的,而不是排他的(因为netty本身就是异步的),也不会block住应用。那motan这样设计的目的是什么呢? 请指教,多谢

rayzhang0603 commented 7 years ago

多链接的场景下请求的长尾会比较小,适合要求低延迟的场景。单链接比较适合要求高吞吐量的场景。 motan中其实通道也是共享的,只是在消息发送时进行了限制,发送后就会归还链接,在一般的使用场景中,并不会对性能产生太大影响。如果单client并发确实比较高,或者请求时client端发送的数据较大时,可以适当调大链接数减少影响。

hanzhihua commented 7 years ago

你说的请求长尾是指等待callback的队列吗?motan中nettyclient.callbackMap吗?

rayzhang0603 commented 7 years ago

不是,callback这些是response相关的部分,只有request使用到了链接池。是指p999、或者p9999这样的请求时间。

hanzhihua commented 7 years ago

知道了,多谢