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

简介: 为什么需要连接池?连接池核心原理与实现是怎么样的呢?连接池核心数据结构是怎样的呢?

《“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)如果有下游新增,需要动态扩充连接池,以实现服务自动发现

 

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

本文转自“架构师之路”公众号,58沈剑提供。

目录
相关文章
|
5月前
|
人工智能 搜索推荐 机器人
《对话》精选|中国大模型凭何成为全球AI底座?
在“人工智能+”上升为国家战略的关键节点,央视财经频道《对话·创新中国行》,邀请到阿里云智能集团首席技术官周靖人、阿里云智能集团副总裁张亮与来自机器人、智能硬件、AIGC视频生成、AI短漫剧、教育等领域的产业先锋:科沃斯集团董事长钱东奇、自变量机器人创始人兼CEO王潜、爱诗科技创始人兼CEO王长虎、巨日禄科技创始人熊义辉、批改邦创始⼈兼CEO王庆棒展开深度对话。嘉宾们围绕“中国大模型,凭何成为全球AI底座?”这一主题共同探讨中国AI的全球竞争力,分享AI落地千行百业的丰富场景,并展望AI带来的时代变革与未来发展。完整节目已于1月25日22:16在CCTV-2及央视频同步播出。
450 1
《对话》精选|中国大模型凭何成为全球AI底座?
|
程序员 Android开发
.Net程序员安卓学习之路6:等待条
原文:.Net程序员安卓学习之路6:等待条 一般在需要访问网络或者长时间操作的时候避免界面无响应才使用:等待条 本例将实现一个无框架的等待条,效果如下: 点击后,使线程Sleep5秒,就出现如下效果:   实现代码如: private ProgressDialog pd...
1256 0
|
10小时前
|
人工智能 自然语言处理 文字识别
阿里云百炼Qwen3.7-Max简介:能力、优势、支持订阅计划参考
Qwen3.7-Max是阿里云百炼面向智能体时代推出的新一代旗舰模型,对标GPT-5.5、Claude Opus 4.7等闭源旗舰。该模型支持百万级token上下文窗口,具备顶级推理能力、多模态搜索与视觉理解增强、流式输出低延迟响应等核心优势,覆盖编程、办公、长周期自主执行等复杂场景。同时支持OpenAI接口兼容,便于系统快速迁移。用户可通过Token Plan团队或节省计划等订阅方式灵活调用,适合企业级高要求场景使用。
7230 31
阿里云百炼Qwen3.7-Max简介:能力、优势、支持订阅计划参考
|
10小时前
|
数据采集 人工智能 前端开发
让 Coding Agent 从黑盒到透明:阿里云 Agent 观测审计数据采集实践
AI Agent 规模化落地带来执行黑盒、行为难追溯、成本难度量三大难题。阿里云基于 OTel 标准,面向 Coding Agent、个人通用助理和框架型 Agent,推出 LoongSuite Pilot、插件及探针等无侵入采集方案,让 Agent 实现可看见、可分析、可审计、可治理。
630 141
|
10小时前
|
人工智能 缓存 自然语言处理
阿里Qwen3.7-Max评测:Agent能力显著提升,耗时与调用成本大幅下降
阿里云百炼推出面向智能体的旗舰大模型Qwen3.7-Max,具备长周期自主执行能力,显著提升编程、办公自动化等复杂任务处理水平;支持MCP集成与多框架兼容,并以限时5折+100万Tokens免费试用大幅降低使用门槛,助力企业高效落地AI应用。在阿里云百炼平台快速体验:https://t.aliyun.com/U/fPVHqY
|
10小时前
|
人工智能 安全 定位技术
CodeGraph深度解析 让Claude Code工具调用直降七成的核心原理与实操教程
如今以Claude Code为代表的AI编程智能体已经成为开发者日常编码、项目重构、漏洞修复的必备工具。但在长期使用过程中,几乎所有开发者都会遇到同一个明显痛点:AI虽然具备强大的代码生成与分析能力,却常常陷入盲目探索的循环中。
1226 2
|
10小时前
|
人工智能 弹性计算 运维
阿里云发布堡垒机智能运维Agent,运维交互进入自然语言新时代
支持自然语言运维,提升效率与安全双保障。
1161 1
|
10小时前
|
存储 定位技术 数据库
CodeGraph 如何让 Claude Code减少 7 成工具调用?
CodeGraph 为 Coding Agent 提供本地代码知识图谱,把函数、类、调用链和框架路由提前整理成“项目地图”,减少盲目搜索和文件读取。它不是新 Agent,而是上下文基础设施,让 Agent 更快找到正确代码路径,平均减少 7 成工具调用。
1297 3
|
10小时前
|
人工智能 运维 JavaScript
阿里云Qoder CN(原通义灵码)全解析 产品形态、版本划分与技术适配说明
在AI辅助开发与智能办公工具持续普及的当下,阿里云旗下原通义灵码正式更名为Qoder CN,同时延伸出QoderWork CN、Qoder CN CLI、Qoder CN Mobile等多款配套产品,形成覆盖代码开发、日常办公、终端交互、移动端使用的完整工具矩阵。Qoder CN核心定位为AI智能编码助手,深度适配主流代码编辑器、集成开发环境以及终端场景;QoderWork CN则偏向桌面端综合办公辅助,二者面向不同使用场景,划分了多个版本档位,搭配差异化资源配额、功能权限与计费规则,同时兼容多款主流大模型。
332 4