当前位置: 首页 > 科技观察

连接池中的两个关键参数是干什么用的?

时间:2023-03-20 21:23:37 科技观察

背??景说来惭愧,从事互联网开发几年了,有些概念还没有完全理解。其中之一就是在ttp客户端配置连接池的时候,maxConnectionsPerHost,maxTotalConnections,我上网搜了一下,发现很多都是含糊不清的。并且有很多失败是因为这两个参数设置不合理,或者根本没有设置maxConnectionsPerHost。题外话,记得刚开始工作的时候,第一次用的是http客户端。看到项目中,配置的连接池有maxConnectionsPerHost,于是问同事这个参数是干什么用的。他的答案是每条路线的最大连接数。好像听懂了,但不敢多问,哈哈。maxTotalConnections的分析过程很容易理解。既然是连接池,那么一个池能装多少呢?这个参数默认是20,当然这个参数在不同的连接池实现中可能不一样,这不是我关注的重点。maxConnectionsPerHost,指示连接池中每个路由的最大池连接数。该值默认为2。我见过很多因为没有设置这个值而导致的失败。这不是我关注的重点。我的问题是,什么是路由?什么是连接?路由和连接是什么关系?首先,什么是连接?这个概念很清楚,connection就是sourceip:sourceport加上destinationip:destinationPorts,以及相关信息组成的逻辑概念。那么什么是路由?我的头,一团糟。网上没有更好的文章可以回答我的问题。我的猜测是目的主机+端口端口就是路由。比如你的项目需要访问百度。然后baidu.com+80就是一条路由。同时你还需要访问csdn,所以csdn.net+80也是一个路由。但这只是我的猜测。然后看源码。不同版本的http客户端实现方法不同。我的项目是3.x和4.x。简单看了下,源码有问题。在路由的实现类中,既有host,也有localAddress。为了继续回答我的问题,我还是直接debug。简单地写一个单元测试,像这样。然后看到这样的资料,以3.x的源码为例,4.x的原理是一样的。在获取连接的过程中,HostConfiguration虽然有本地地址信息,但是值为空。所以路由真正起作用的是主机。获取连接后,检查连接是否打开。如果不是,则执行open方法,此时会设置localAddress。即建立了真正的连接。接下来我们看看Http连接池,有数据是什么情况。至此我们了解了连接池是以主机(远程服务,如baidu.com)为一组来建立连接池的。maxConnectionsPerHost用于控制一个组内的连接池数量,也就是有同学提到的,控制某个服务的并发访问数。结束语maxConnectionsPerHost,连接池是以主机(远程服务,如baidu.com)为一组建立的连接池。该参数用于控制一个组中连接池的数量,或者说控制访问,并发服务的数量。需要注意的是默认值为2,如果不设置这个值。但是如果流量变大了,那么线上故障就等着你了。