go 连接池

简单tcp服务

源码

gitee: https://gitee.com/luyue_zhang/go_rpc_2/tree/master/tcp_server_demo

演示

在这里插入图片描述

连接池

在简单tcp服务中,每次请求耗费一个连接net.dial()。创建一个连接是昂贵的:

  1. 发起系统调用
  2. TCP三次握手
  3. 高并发场景可能耗尽文件描述符

所以我们可以考虑复用连接,实现连接池

连接池原理

取连接流程图
还连接流程图

源码

gitee: https://gitee.com/luyue_zhang/go_rpc_2/tree/master/conn_pool

说明:仅简单测试,未提供完备测试用例

思考

idleConnList(空闲队列)使用channel还是切片?
切片(并发阻塞队列)channel
并发控制加锁天然支持
性能锁竞争就可能影响性能,但sql.DB就用的切片 // 影响可能还好无锁设计,性能不错,适合高并发场景
阻塞机制需要自行控制等待机制,如使用sync.Cond天然支持
代码灵活性支持复杂管理,比如:
1. 遍历,处理过期连接
2. 连接健康检查,比如随机访问
3. 连接优先级、权重
4. 查看队首、队尾元素,判断出队时机
FIFO,相较来说,支持简单操作

开源实现

sql.DB、silenceper

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值