一、连接如何通过连接访问下游
工程架构中有很多访问下游的池原需求,下游包括但不限于服务/数据库/缓存,简单其通讯步骤是分钟为:
(1)与下游建立一个连接
(2)通过这个连接,收发请求
(3)交互结束,系列关闭连接,连接释放资源
这个连接是池原什么呢,通过连接怎么调用下游接口?简单服务/数据库/缓存,官方会提供不同语言的分钟Driver、Document、系列DemoCode来教使用方建立连接与调用接口,连接以MongoDB的池原C++官方Driver API为例(伪代码):
MongoDB的C++官方Driver API为例(伪代码): DBClientConnection* c = new DBClientConnection(); c->connect(“127.0.0.1:8888”); c->insert(“db.s”, BSON(”shenjian”)); c->close();
这个DBClientConnection就是一个与MongoDB的连接,官方Driver通过它提供了若干API,简单让用户可以对MongoDB进行连接,分钟增删查改,系列关闭的操作,从而实现不同的业务逻辑。

二、为什么需要连接池
当并发量很低的时候,上述伪代码没有任何问题,但当服务单机QPS达到几百、服务器托管几千的时候,建立连接connect和销毁连接close就会成为瓶颈,此时该如何优化?
结论也很简单,服务启动的时候,先建立好若干连接Array[DBClientConnection],当有请求过来的时候,从Array中取出一个,执行下游操作,执行完再放回,从而避免反复的建立和销毁连接,以提升性能。
而这个对Array[DBClientConnection]进行维护的数据结构,就是连接池。有了连接池之后,数据库操作的伪代码变为:
DBClientConnection* c = ConnectionPool::GetConnection(); c->insert(“db.s”, BSON(”shenjian”)); ConnectionPool::FreeConnection(c);三、连接池核心接口与实现
通过上面的讨论,可以看到连接池ConnectionPool主要有三个核心接口:
(1)Init:初始化好Array[DBClientConnection],这个接口只在服务启动时调用一次
(2)GetConnection:请求每次需要访问数据库时,不是connect一个连接,而是通过连接池的这个接口来拿
(3)FreeConnection:请求每次访问完数据库时,网站模板不是close一个连接,而是把这个连接放回连接池
连接池核心数据结构:
(1)连接数组Array DBClientConnection [N]
(2)互斥锁数组Array lock[N]
连接池核心接口实现:
Init(){ for i = 1 to N { Array DBClientConnection [i] = new(); Array DBClientConnection [i]->connect(); Array lock[i] = 0; } }说明:把所有连接和互斥锁初始化
GetConnection() for i = 1 to N { if(Array lock[i] == 0){ Array lock[i] = 1; return Array DBClientConnection[i]; } } }说明:找一个可用的连接,锁住,并返回连接
FreeConnection(c) for i = 1 to N { if(Array DBClientConnection [i] == c){ Array lock[i] = 0; } } }说明:找到连接,把锁释放

可以发现,简单的连接池管理并不是很复杂,基本原理即如上所述。
四、未尽事宜
上述伪代码忽略了一些细节,在实现连接池中是需要考虑的:
(1)如果连接全部被占用,是返回失败,还是让上游等待
(2)需要实施连接可用性检测
(3)为了让调用方更友好,可能还需要包装一层DAO层,让“连接”这个东西对调用方都是黑盒的
(4)通过freeArray,connectionMap可以让取连接和放回连接都达到O(1)时间复杂度
(5)可以通过hash实现id串行化
(6)负载均衡、故障转移、服务自动扩容都可以在这一层实现
【本文为专栏作者“58沈剑”原创稿件,转载请联系原作者】

戳这里,看该作者更多好文
相关文章:
IT技术网源码库香港云服务器服务器租用企商汇IT资讯网益华科技亿华云源码下载云站无忧科技前瞻云智核亿华科技益华科技益强编程舍益强科技亿华智慧云益华IT技术论坛运维纵横益强IT技术网创站工坊益华科技码上建站智能时代编程之道技术快报全栈开发汇智坊益强智囊团亿华互联亿华智造亿华云计算思维库益强资讯优选亿华云极客编程益强智未来益强前沿资讯多维IT资讯亿华灵动
0.1394s , 11681.1328125 kb
Copyright © 2025 Powered by 连接池原来这么简单(一分钟系列),汇智坊 滇ICP备2023006006号-2