KA,连接池居然这么简单?

简介: 《“ID串行化”保证群消息顺序性》提到,可以通过连接池的改造,实现ID串行化,本篇讲讲连接池的原理,以及实现细节。

《“ID串行化”保证群消息顺序性》提到,可以通过连接池的改造,实现ID串行化,本篇讲讲连接池的原理,以及实现细节。

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

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

(1)与下游建立一个连接;

(2)通过这个连接,收发请求;

(3)交互结束,关闭连接,释放资源;

不管是服务/数据库/缓存,官方会提供不同语言的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();

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

image.png

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

为什么需要连接池?

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

(1)当服务启动的时候,先建立好若干连接Array[DBClientConnection];

(2)当请求到达的时候,再从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;

   }

  }

}

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

image.png

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

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

(1)需要实施连接可用性检测,如果有连接失效,需要重建连接;

(2)通过freeArray,connectionMap等数据结构,可以让取出连接和放回连接都达到O(1)时间复杂度;

(3)可以通过hash取连接,实现id串行化;

(4)每条连接被取到的概率必须相同,以实现负载均衡;

(5)如果有下游故障,失效连接必须剔除,以实现故障自动转移;

(6)如果有下游新增,需要动态扩充连接池,以实现服务自动发现;

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

image.png

架构师之路-分享可落地的技术文章

目录
相关文章
|
前端开发 JavaScript 程序员
如何做好IT类的技术面试
如何做好IT类的技术面试
|
Rust 运维 安全
Kata3.0.0 x LifseaOS x 龙蜥内核三管齐下!带你体验最新的安全容器之旅
袋鼠RunD正式成为安全容器上游社区最新3.0.0标准,龙蜥也已推出最新体验包,带给大家更完整的安全容器体验。
Kata3.0.0 x LifseaOS x 龙蜥内核三管齐下!带你体验最新的安全容器之旅
|
存储 Kubernetes 应用服务中间件
容器服务ACK常见问题之SLB公网改成ALB失败如何解决
容器服务ACK(阿里云容器服务 Kubernetes 版)是阿里云提供的一种托管式Kubernetes服务,帮助用户轻松使用Kubernetes进行应用部署、管理和扩展。本汇总收集了容器服务ACK使用中的常见问题及答案,包括集群管理、应用部署、服务访问、网络配置、存储使用、安全保障等方面,旨在帮助用户快速解决使用过程中遇到的难题,提升容器管理和运维效率。
|
SQL 数据库
MybatisPlus中and和or的使用
MybatisPlus中and和or的使用
899 0
MybatisPlus中and和or的使用
|
机器学习/深度学习 传感器 算法
【CNN时序预测】基于混合卷积神经网络和循环神经网络 CNN - RNN 实现时间序列预测附Matlab代码
【CNN时序预测】基于混合卷积神经网络和循环神经网络 CNN - RNN 实现时间序列预测附Matlab代码
|
人工智能 达摩院 自然语言处理
阿里云的建站产品云·速成美站有哪些优势?自助建站多少钱?
本文介绍了阿里云建站产品云·速成美站的版本、优势、如何选择以及云·速成美站的常见问题,新手用户可通过此文了解和选购云·速成美站。
823 0
阿里云的建站产品云·速成美站有哪些优势?自助建站多少钱?
|
人机交互 网络架构 数据格式
炫酷 RGB 之.NET nanoFramework 点灯大师
前面介绍了 .NET nanoFramework 入门,本文继续以微雪的 ESP32-S2-Pico 为例介绍 .NET nanoFramework 的开发:控制 ESP32 板载 RGB 灯 和 外接 RGB 灯。内容包含 状态灯的意义、WS2812 、HSV、PWM 等相关知识。
419 0
炫酷 RGB 之.NET nanoFramework 点灯大师
|
域名解析 移动开发 弹性计算
速成美站-教程指导
云·速成美站,帮助中心,教程指导!
|
弹性计算 算法 容灾
云原生下,如何保障业务系统的高可用性?
本文章由阿里云高可用产品的产品经理牛兔在阿里云社群直播中,从云原生角度来讲解如何保障业务系统的高可用性。
2000 0
云原生下,如何保障业务系统的高可用性?