乐趣区

关于golang:通用连接池帮你解决资源管理难题

前言

群里老有同学问,go-zero数据库 redis 库是否有连接池反对。先说论断: 有的,能够放心大胆用!

从框架设计来说,对于数据库连贯这种资源当然是尽可能减少频繁操作:

  1. 为业务减负
  2. 晋升框架本身的性能
  3. 池化技术是一个通用化技术,自身就应该作为一个通用库撑持框架的下层业务

所以不论是 sqlxredis,以及 mongo,等当前可能要反对的数据源类型,底层的池化解决都是通用的;所以当开发者须要一个池化解决组件时,go-zero 也是提供的。

池化技术支持的库就位于:core/resourcemanager.go。上面来看看这个库的应用~~

应用

应用的话,咱们间接来看 sqlx,它是怎么用的:

// 1. 初始化
var connManager = syncx.NewResourceManager()

func getCachedSqlConn(driverName, server string) (*db, error) {val, err := connManager.GetResource(server, func() (io.Closer, error) {
    // 2. 此处才是真正创立连贯的中央
    conn, err := newDBConnection(driverName, server)
    ...
    // 3. 将连贯返回给连接池【外部也必定是存起来】return &db{DB: conn,}, nil
  })
  ...
  return val.(*db), nil
}

说说其中的要点:

  1. NewResourceManager:创立一个池子
  2. GetResource(key, createFunc):key 是用来避免并发获取资源时反复申请,createFunc 才是正在用来创立资源的函数【此函数须要有开发者本人编写合乎业务需要资源】

总结一下资源池的模型:

// 1. new
var manager = NewResourceManager()

// 2. 业务资源获取函数
func getResource(key string) (*resource, error) {return manager.GetResource(key, createFunc);
}

// 3. 业务资源创立函数【由开发者本人编写,此处只是一个样例】func createFunc() (io.Closer, error) {
  // 关上一个资源
  conn, err := openResource();
  // 设置一下资源配置
  conn.setConfig()
  
  return conn, err;
}

整体剖析

其实流程上很简略,其中还有咱们陈词滥调的 sharedCalls

  1. GetResource,携带特定的 key,到资源池中的 map 中查找:

    • 查到了,间接返回
    • 没有查到,调用传入的 create();此处才真正创立一个实在的资源连贯,并放入 map
  2. 其中对 map 的查问和写入,都得加锁。
  3. 其中在对资源池进行操作时,附加上 sharedCalls:避免并发申请时有效流量申请以及共享申请后果。

对于 SharedCalls,还不分明的同学,能够到 go-zero 官网文档中认真查看。

总结

本篇文章对 go-zero 的资源池库从应用到构造进行了剖析。大家也能够在业务中常产生资源申请的逻辑处,加上 resourcemanager,实质上也是给资源加上一个缓存,节俭重复创立。

对于 go-zero 更多的设计和实现文章,能够关注『微服务实际』公众号。

我的项目地址

https://github.com/tal-tech/go-zero

欢送应用 go-zero 并 star 反对咱们!

微信交换群

关注『微服务实际 』公众号并点击 交换群 获取社区群二维码。

go-zero 系列文章见『微服务实际』公众号

退出移动版