Golang连接池

一.为什么需要Golang连接池

       服务和服务之间的连接是开发过程中很常见的操作,为了服务解耦,减少相互依赖,增强系统稳定性,灵活性,所以会增加许许多多的服务通信链路,随着服务通信链路的增加,网络通信次数就会成倍的增长,那么随之而来的就是网络资源的消耗加剧,例如:带宽,连接数以及cpu,内存等。

  • 每个连接建立时都会申请内存用来做socket buffer
  • 每个连接都要做三次握手四次挥手
  • 每个连接关闭时都要释放内存空间
  • 并发高时,会产生大量的连接,影响系统调度,会占用太多系统资源

二.连接池的实现流程

 2.1 连接池的结构

  • 空闲连接切片:freeConns []*Conn
  • 空闲连接的锁:lastDialErrorMu sync.RWMutex
  • 控制连接池大小的管道:queue chan struct{}

2.2 获取连接

  • 验证连接池是否关闭。
  • 验证是否超过连接池的的最大连接数,没超过计数管道容量减少一个单位;如果超过了1秒后重试,直到重试时间超过最大等待时间则返回失败。
  • 没有超过连接池最大连接数,如果空闲连接切片中有连接,则判断获取到的连接是否超时;如果没有空闲连接则创建一个新连接,创建成功返回,创建失败则将之前技术管道容量减少的一个单位还原。

2.3 释放连接

  • 如果连接失效,则把连接关闭,计数管道容量增加一个单位。
  • 如果连接没有失效,把连接放到空闲连接切片里,计数管道容量增加一个单位。

 

 

 

 

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值