以100每秒的速度向mysql写数据,持续5s,此时我们的程序和mysql建立了多少个tcp连接?
从编程的角度来看,一个问题的解答过程,无非是寻求输入输出,这里输出是多少个tcp连接,那么就要锁定输入,也就是参数,有哪些因素会影响这个问题?
在牛牛看来只有两点:mysql当前处理能力和连接池配置。
参数分析
1.mysql处理能力
PS: 正常实体机的mysql,即使配置差到1核1G,也完全能胜任100/s的单纯插入请求。只有在mysql本身异常,或有其他进程占用系统资源时,才会出现1s处理不过来100个请求的情况。这里的两个分支只是逻辑上的讨论。
2.连接池
连接池是实现连接复用的手段,和mysql交互时,每次需要建立一个连接,用完就会关掉,这就是短连接。如果在高并发场景,反复建立连接的成本是很高的,所以我们可以使用长连接,即连接用完后先不关闭,放到一个池子里等待复用,这个池子就叫连接池。
如图所示,连接池暂存了使用完成之后的mysql连接以待复用,最大空闲连接数就是这个池子的大小。连接池通过一系列参数控制了针对mysql的连接复用策略,一般是由客户端引擎实现,支持哪些参数也由客户端引擎决定,通常而言所有的客户端引擎都支持如下几个主要参数:
可以看到,最大连接数、最大空闲连接数以及最大空闲时间,这三个参数是起决定作用的。最大连接数保证了长连接➕短连接的上限,避免了单一程序耗尽mysql的连接资源。最大空闲连接数决定了长连接的个数,最大空闲时间则决定了长连接的持续性。
参数正交
回到该题目上看,我们利用控制变量来分析,最大连接数和最大空闲时间我们假设足够大,以保证mysql的正常响应和长连接的可持续性。剩下的就是mysql本身消费能力,和最大空闲连接数即长连接数两个维度的正交了,我们分如下情况:
圆圈中50:x表示这50个连接是在第x秒产生;长连接中doing表示准备处理中,done表示做完;短连接默认都是doing;红色字体表示下一秒就会处理,连线表明某个连接的前世今生。
第一秒 | 由于连接池为空,产生100个 |
---|---|
第二秒 | 复用连接池的50个,产生50个 |
第三秒 | 复用连接池的50个,产生50个 |
第四秒 | 复用连接池的50个,产生50个 |
第五秒 | 连接池都在忙绿中,新产生100个 |
小结
简简单单一个问题,牵引出的其实是mysql连接池的本质,这也是面试官面试时想考察的能力。
这个问题至少能考察出面试者两方面的能力,一是看面试者的思路是否清晰,在实际业务场景中提出来的需求,大多需要仔细思考来判断存在哪些影响因素,而在面试中留给面试者思考的时间并不多,大家的能力高下立判;第二点则是了解面试者对这些基本知识点的掌握情况,这也是对面试者的知识储备进行考察。
牛牛比较认可这种结合实际场景的面试题目,希望阅读完本篇文章之后大家能有所收获。