《“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();

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


这个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;

   }

  }

}

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


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

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

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

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

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

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

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

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

KA,连接池居然这么简单?相关推荐

  1. nodejs连接池 连接关闭_「转」连接池居然这么简单?

    <"ID串行化"保证群消息顺序性>提到,可以通过连接池的改造,实现ID串行化,本篇讲讲连接池的原理,以及实现细节. 通常如何通过连接访问下游? 工程架构中有很多访问下游 ...

  2. Lettuce连接池超时问题简单记录

    使用Lettuce连接池,隔一段时间不连,再去连,就出现超时问题 问题分析定位 解决方案 方案一 方案二 问题分析定位 一直连着没问题,只要间隔一段时间不连,再去连的时候就会出现超时问题,超时几次后就 ...

  3. Tomcat4/5连接池的设置及简单应用示例

    标题:Tomcat4/5连接池的设置及简单应用示例 关键字:Tomcat 连接池 JDBC驱动 Context 作者:jrq 内容: 一.Win2k下Tomcat4的连接池的配置 1.安装JDK1.4 ...

  4. AsyncHttpClient的连接池使用逻辑

    AsyncHttpClient的连接池结构很简单, NettyConnectionsPool内部重要的几个变量如下 // 连接池, 通过 host 区分不同的池private final Concur ...

  5. golang mysql断线_MySQL的连接池、异步、断线重连-Go语言中文社区

    MySQL长连接 MySQL短连接每次请求操作数据库都需要建立与MySQL服务器建立TCP连接,这是需要时间开销的.TCP连接需要3次网络通信.这样就增加了一定的延时和额外的IO消耗.请求结束后会关闭 ...

  6. 走进JavaWeb技术世界3:JDBC的进化与连接池技术

    网络访问 随着 Oracle, Sybase, SQL Server ,DB2,  Mysql 等人陆陆续续住进数据库村, 这里呈现出一片兴旺发达的景象, 无数的程序在村里忙忙碌碌, 读写数据库,   ...

  7. AsyncHttpClient源码分析-基于Netty的连接池实现

    原文地址:asynchttpclient源码分析-基于Netty的连接池实现 最近项目重构,有了个机会更多接触一个有别于HttpAsyncClient的异步网络框架AsyncHttpClient,是个 ...

  8. 【知了堂学习笔记】数据库连接池简介,以及Eclipse中C3p0连接池的简单运用

    1.普通的JDBC连接数据库的弊端 普通的JDBC数据库连接使用 DriverManager 来获取,每次向数据库建立连接的时候都要将 Connection 加载到内存中,再验证用户名和密码(得花费0 ...

  9. swoole mysql 连接数_用swoole简单实现MySQL连接池

    MySQL连接池 在传统的网站开发中,比如LNMP模式,由Nginx的master进程接收请求然后分给多个worker进程,每个worker进程再链接php-fpm的master进程,php-fpm再 ...

最新文章

  1. Not enough memory. Please load a smaller dataset or use larger heap size.
  2. 分块的单点修改查询区间和_模版 单点修改,区间查询
  3. va_start、va_end、va_list的使用
  4. 提高页面显示速度的秘技
  5. 使用SAP WebIDE创建开发Java应用,并且在浏览器里调试
  6. 解决Tocmat6.x的catalina.out日志不断增加问题
  7. wetech-cms内容管理系统源码
  8. 业务运维:站在企业转型风口上的云智慧
  9. Python学习-初始列表
  10. [转载]如何用C#语言构造蜘蛛程序
  11. 关于web.xml配置中的url-pattern
  12. mac 思科 链路聚合_思科链路聚合协议实验.docx
  13. 20220508ARCore 初体验
  14. 0X00000000指令引用的0x00000000内存该内存不能为read或written
  15. 通过H5(浏览器/WebView/其他)唤起本地app
  16. gta5因为计算机丢失xinput1,GTA5 运行缺少这个xinput1-3.dll,怎样办
  17. 手提电脑亮度不能调节,亮度调节按钮变灰,找不到调节亮度按钮
  18. 数据科学猫:数据分析的主要类型、描述性分析、预测性分析与规范性分析
  19. 新手入门人工智能领域的历程 --干货
  20. TokenGazer评级丨MakerDao:去中心化金融趋势确立,项目治理恐有中心化风险

热门文章

  1. [react-native]-ReactNative为iOS打包ipa文件
  2. Win10下MySQL5.7.20 Mysql(64位)解压版安装及bug修复
  3. 用scheme重写Python的三大函数map reduce 和filter
  4. WCF 第六章 序列化和编码之DataContractJsonSerializer
  5. CDN简介及linux环境下搭建
  6. C/C++中程序内存区域划分大总结
  7. 关于有限自动机的一篇不错的文章
  8. mysql+xml+注释,springboot整合mybatis完整示例, mapper注解方式和xml配置文件方式实现(我们要优雅地编程)...
  9. redis哨兵集群数据迁移_redis集群数据迁移—redis-migrate-tool神器
  10. parcelable 缺点_成都金牛区茶道炭优缺点-兴木华木炭