在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
common-pool: 对于一些对象的频繁创建会带来很大的系统开销,并且需要对对象数量进行控制来降低资源消耗,比如数据库连接,线程等 common-pool采用了缓存思想来解决这个问题,预先把一些对象资源创建好并统一保存起来,也就是保存到逻辑上的对象池中 等到需要对象时从池中直接获取,不需要时归还到池中 目前对象池技术已经有很多开源优秀的库了,比如:Java实现的Apache Commons Pool、Go Commons Pool go-common-pool就是参照Apache Commons Pool的思想,用go语言实现的一个通用对象池
原理分析 几个重要的数据结构介绍 factory: 包含了一个通用对象常用的方法集合,可以理解为一个接口,client可以根据不同的对象特性自定义操作
ObjectPool: 主要包含了对象池的一些属性方法 idleObjects是一个双向队列结构,保存一些可用对象,可以用FIFO、LIFO方式访问对象 allObjectsy是一个map结构,根据key-value形式保存对象,主要用来校验对象是否存在合法 也就是说一个对象在对象池中保存两份数据,对象池会启动一个协程定时维护对象
config: 包含对象池的一些配置
初始化过程 启动一个go run去定时维护对象池中的对象集合,主要分以下几步 第一步:检查空闲对象集合剔除即将失效或者已经失效对象(通过factory.Validate()判断),不会全量检查只会检查一定数量或者比例的空闲对象(数量可配置) 第二步:遍历allObjects集合中的所有对象,剔除失效对象 第三步:判断idleObjectsCount是否大于MinIdleCount,如果小于则创建对象,并往空闲对象队列里添加节点,直到二者相等 疑问:二者是同一个分支执行过程,既然有了第一部分的检查,不知道第二步存在的意义是什么。
获取对象:BorrowObject 首先会去idleObjects队列里面获取一个对象,如果为空说明队列里面没有现成的对象,则去创建一个新的对象 在创建对象的过程中会先更新createCount,然后判断createCount是否大于MaxTotal 如果小于则继续创建对象,调用factory.Make()创建真正的对象,更新allObjects集合,如果创建成功返回新对象,如果失败返回nil 如果大于则说明对象池容量已经达到最大值, 这时候有两种选择,一种是返回错误,一种是先阻塞当前协程,等到其他协程归还对象后发送一个信号,唤醒当前协程最终获取到对象 第二种方式中支持两个设置: 一种是无限等待时间直到有错误产生,监听一种channel即可 一种是指定超时时间,超时后返回空对象和错误,需要用select监听两个channel,除了与其他协程通信channel之外,还需要一个Timer.C channel时间超时channel 伪代码可以简化为: func takeWhithTimeout(){
归还对象:ReturnObject 1. 去allObjects去检查归还对象是否合法存在 2. 校验归还对象是否有效,调用factory.Validate() 3. 判断idleObjectsCount是否大于MaxIdleCount,如果小于则添加对象到idleObjects队列,否则销毁对象
总结: go-common-pool对象池中还有很多细节没有体现出来,上面只有对整个对象池几个重要的操作进行了一个简单版的描述,后续会更新一些细节实现上的技巧 在这里我想总结下个人认为比较重要的几点 1. 一个对象的操作make(创建)-->active(激活)-->validate(校验)-->destory(销毁)-->passivate(钝化) 创建、校验操作是很容易理解也是很常用的两个操作,一般对象定义好这两个操作就可以了。 激活、钝化不容易理解,这两个操作是相对的,一个是初始化对象,一个是反初始化对象,消除之前对象占用的一些资源, 具体需要结合应用场景,不同的对象类型比如数据库连接,socket连接,线程对应不同的操作,在翻阅了一些资料后还没找到一个很好的解释。 2. poolObject是整个对象池很核心的一个对象,对外连接factory的对象操作,对内连接allObjects、idleObjects集合的操作 idleObjects/allObjects都是通过锁机制来保证线程安全操作的 几个重要事件: 一个对象加入idleObjects时需要进行(钝化)操作 一个对象在获取时需要进行(激活-->校验)操作 一个对象在归还时需要进行(校验-->钝化)操作 其中任何一步失败都需要销毁对象 3. 获取对象时支持阻塞非阻塞两种方式 |
请发表评论