连接池中非常关键的两个参数,到底是干啥用的?

开发 前端
说来惭愧,从事互联网开发好些年了,有些概念一直没有彻底搞清楚。其中之一就是,ttp client配置连接池的时候,maxConnectionsPerHost,和maxTotalConnections,在网上搜了一圈,发现很多都讲的含含糊糊的。

 背景

说来惭愧,从事互联网开发好些年了,有些概念一直没有彻底搞清楚。其中之一就是,ttp client配置连接池的时候,maxConnectionsPerHost,和maxTotalConnections,在网上搜了一圈,发现很多都讲的含含糊糊的。而且有不少故障都是这两个参数设置不合理,或者压根就没有设置maxConnectionsPerHost等等。

题外话,我记得我刚参加工作的时候,第一次使用http client。看见项目中,配置的连接池,有maxConnectionsPerHost,我就请教同事,这个参数是干啥的。他的答复是每条路由最大的连接数。我似懂非懂,但是又不敢多问,哈哈。

 

分析过程

maxTotalConnections,很好理解。既然是一个连接池,那么一个池子最大能放多少呢?这个参数默认是20。当然这个参数,在不同的连接池实现中可能是不一样,这不是我关注的重点。

 

连接池中非常关键的两个参数,到底是干啥用的?

 

maxConnectionsPerHost,表示一个连接池中,每条路由,池化的最大连接个数。这个值,默认是2,我看过不少故障是没有设置此值导致的。这个不是我关注的重点,我的疑问是,什么是路由?什么是连接?路由和连接的关系是啥?

首先连接是什么?这个概念很清晰,连接就是源ip:源端口加目的ip:目的端口,以及相关信息形成的逻辑概念。

那什么是路由呢?我的脑袋,一团混乱。网上也没有比较好的文章,能解答我的疑问。我的猜测是,目的host+port端口就是路由。比如你的项目中需要访问百度。那么baidu.com+80就是一条路由。同时也需要访问csdn,那么csdn.net+80也是一条路由。可是这只是我的猜测。

那看看源码吧。不同版本的http client实现方式是不一样的。我手头的项目有3.x,也有4.x的。我都简单看了下,但是源码都有一个问题是,route的实现类中,既有host,也有localAddress。

 

连接池中非常关键的两个参数,到底是干啥用的?

 

为了继续解答我的疑问,还是直接debug。简单写了一个单元测试,类似这样。

 

连接池中非常关键的两个参数,到底是干啥用的?

 

然后我看到了这样的信息,以3.x源码为例子,4.x原理是一致的。

 

连接池中非常关键的两个参数,到底是干啥用的?

 

获取连接的过程,HostConfiguration 虽然其中有本地的地址信息的,但是值是空的。因此route真正起作用的是host。

 

连接池中非常关键的两个参数,到底是干啥用的?

 

获取好连接后,检查下连接是不是打开了,如果没有打开,执行open方法,此时会设置localAddress。也就是一条真正的连接才算创建完成。

接下来我们看下Http的连接池,有数据的情况是啥样。

 

连接池中非常关键的两个参数,到底是干啥用的?

 

至此我们就清晰了,连接池是以host(远端的服务,例如baidu.com)为组,来建立连接池。maxConnectionsPerHost 用来控制一组中连接池的个数,也就是有些同学提到的,用来控制访问某个服务并发的个数。

结论

maxConnectionsPerHost,连接池是以host(远端的服务,例如baidu.com)为组,来建立连接池。此参数用来控制一组中连接池的个数,或者用来控制访问,某个服务并发的个数。

需要注意默认值是2,如果不设置此值。但是流量变大,那么线上故障就会等着你。

责任编辑:武晓燕 来源: 今日头条
相关推荐

2010-03-18 14:22:46

Python数据库连接

2021-08-13 05:47:48

通信设计院通信行业设计院

2022-09-26 07:08:16

无线通信CT

2022-04-10 19:26:07

TypeScript类型语法

2021-12-16 15:11:59

Facebook天秤币加密货币

2022-09-06 21:38:45

数字人数字孪生

2024-08-26 14:23:56

2021-03-22 07:45:05

Sentinel微服务开源的项目

2024-07-12 15:08:23

Python@wraps函数

2020-10-25 20:05:29

Pythonyield开发

2022-02-16 20:04:08

容器KubernetesShim

2020-04-22 13:29:35

基带射频信号

2024-02-22 08:00:00

SoraOpenAI

2022-08-08 08:00:00

人工智能机器学习计算机应用

2022-03-16 00:15:56

Flask扩展插件

2024-02-07 12:35:00

React并发模式concurrent

2012-02-13 15:50:59

2021-01-29 12:24:22

电脑电子计算机

2020-09-21 15:16:09

大数据IT技术

2024-07-03 12:04:42

C++this​
点赞
收藏

51CTO技术栈公众号