连接池居然这么简单? 精选

2022-11-17
关注

​服务连接池,数据库连接池,缓存连接池,连接池是微服务分层架构中不可或缺的一个组件,本篇讲讲连接池的原理,以及实现细节。

 通常如何通过连接访问下游?

工程架构中有很多访问下游的需求,下游包括但不限于服务/数据库/缓存,其通讯步骤是为:

  • 与下游建立一个连接;
  • 通过这个连接,收发请求;
  • 交互结束,关闭连接,释放资源;

不管是服务/数据库/缓存,官方会提供不同语言的Driver、Document、DemoCode来指导使用方建立连接与调用接口。

以MongoDB的C++官方DriverAPI为例:

DBClientConnection* c = new DBClientConnection();
c->connect(“127.0.0.1:8888”);
c->insert(“db.s”, BSON(”shenjian”));
c->close();

画外音:建立连接、发送请求、关闭连接,都非常清晰。

这个DBClientConnection就是一个与MongoDB的连接,官方Driver通过它提供了若干API,让用户可以对MongoDB进行连接,增删查改,关闭的操作,从而实现不同的业务逻辑。

为什么需要连接池?

当并发量很低的时候,连接可以临时建立,但当服务吞吐量达到几百、几千的时候,建立连接connect和销毁连接close就会成为瓶颈,此时该如何优化呢?

  • 当服务启动的时候,先建立好若干连接Array[DBClientConnection];
  • 当请求到达的时候,再从Array中取出一个,执行下游操作,执行完放回;

从而避免反复的建立和销毁连接,以提升性能。

而这个对Array[DBClientConnection]进行维护的数据结构,就是连接池。

有了连接池之后,数据库操作的伪代码变为:

DBClientConnection* c = 
ConnectionPool::GetConnection();
c->insert(“db.s”, BSON(”shenjian”));
ConnectionPool::FreeConnection(c);

画外音:取出连接、发送请求、放回连接,也非常清晰。

连接池核心原理与实现是怎么样的呢?

可以看到连接池ConnectionPool主要有三个核心接口:

  • Init:初始化Array[DBClientConnection],这个接口只在服务启动时调用一次;
  • GetConnection:请求每次需要访问数据库时,不connect一个新连接,而是通过连接池的这个接口来拿连接;
  • FreeConnection:请求每次访问完数据库时,不是close一个连接,而是把这个连接放回连接池;

连接池核心数据结构是怎样的呢?

连接池至少包含两个核心数据结构:

  • 连接数组Array DBClientConnection[N];
  • 互斥锁数组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;
}
}
}

画外音:找到连接,把锁释放。

会发现,连接池管理核心并没有想象的复杂。

除了核心代码,连接池还需要考虑哪些因素呢?

  • 需要实施连接可用性检测,如果有连接失效,需要重建连接;
  • 通过freeArray,connectionMap等数据结构,可以让取出连接和放回连接都达到O(1)时间复杂度;
  • 可以通过hash取连接,实现id串行化;
  • 每条连接被取到的概率必须相同,以实现负载均衡;
  • 如果有下游故障,失效连接必须剔除,以实现故障自动转移;
  • 如果有下游新增,需要动态扩充连接池,以实现服务自动发现;

思路比结论更重要,希望大家有收获。​

您觉得本篇内容如何
评分

相关产品

Honeywell 霍尼韦尔智能工业 在线/便携烟气分析仪专用传感器 气体传感器

CO 传感器;SO2传感器;NO2 传感器;NO传感器;氧气传感器

微著科技 高性能传感器ASIC解决方案 MEMS传感器

微著科技是国内为数不多能够给传感器厂商提供定制高性能传感器解决方案的团队,目前已为国内众多院所及知名传感器公司提供了十余个传感器解决方案并已经实现量产。微著传感器ASIC方案的特点:成熟的仪表信号模块IP易于快速搭建;系统方案超低噪声;成熟的24ADC可同时实现模拟数字传感器方案设计;高效率及丰富的方案设计经验。

南方泰科 TGM 压力传感器

TGM是一款SOP8封装的压阻式MEMS压力传感器,其压力传感器芯片封装在 SOP8 塑封壳内。在传感器压力量程内,当用固定电压供电时,传感器产生毫伏输出电压,正比于输入压力。压力传感器芯片为绝压,可提供不同的压力量程的SOP8 压力传感器。

鑫精诚传感器 XJC-T001 压力传感器

◆传感器激光焊接密封,环境适应性较强 ◆球形联接件,始终保持模块的垂直称重状态 ◆支撑螺栓,防止设备倾覆且方便维护 ◆接地装置,保护传感器免受电源浪涌冲击 ◆过载保护装置,保护传感器免受冲击力

Huba Control 富巴 525系列 压力传感器

525系列压力传感器采用集公司20多年研发经验的陶瓷压力传感器芯片技术。该系列压力传感器可选压力范围大,电气连接形式多。最小量程为50mbar。大批量使用具有很好的性价比。

佰测传感 MS71 传感器

MS71差压传感器

Cubic 四方光电 PM3009BP 室外粉尘传感器

PM3009BP是一款专门针对餐饮油烟监测的油烟传感器,其采用旁流采样方式,自带除水雾装置,结合智能颗粒物识别算法,确保传感器能够快速准确的检测油烟浓度的变化,同时创新的镜头自清洁技术的应用,能够长效防护传感器油烟污染,大幅度延长传感器的使用寿命。

评论

您需要登录才可以回复|注册

提交评论

广告

谜知

这家伙很懒,什么描述也没留下

关注

点击进入下一篇

中芯集成招股书

提取码
复制提取码
点击跳转至百度网盘