通用连接池帮你解决资源管理难题

简介: 通用连接池帮你解决资源管理难题

前言

群里老有同学问,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
  1. 其中对 map 的查询和写入,都得加锁。
  2. 其中在对资源池进行操作时,附加上 sharedCalls :防止并发请求时无效流量请求以及共享请求结果。

关于 SharedCalls,还不清楚的同学,可以到 go-zero 官方文档中仔细查看。

总结

本篇文章对 go-zero 的资源池库从使用到结构进行了分析。大家也可以在业务中常发生资源申请的逻辑处,加上 resourcemanager,本质上也是给资源加上一个缓存,节省反复创建。

关于 go-zero 更多的设计和实现文章,可以关注『微服务实践』公众号。

项目地址

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

相关文章
|
8月前
|
弹性计算 运维 安全
一文读懂云上大规模资源管理的最佳实践
阿里云弹性计算团队十三位产品专家和技术专家共同分享云上运维深度实践,详细阐述如何利用CloudOps工具实现运维提效、弹性降本。
132051 5
一文读懂云上大规模资源管理的最佳实践
|
8月前
|
Kubernetes 网络性能优化 调度
Koordinator v1.4 正式发布!为用户带来更多的计算负载类型和更灵活的资源管理机制
Koordinator v1.4 正式发布!为用户带来更多的计算负载类型和更灵活的资源管理机制
|
4月前
|
监控 数据挖掘
有效的动态资源管理
有效的动态资源管理
158 73
|
2月前
|
存储 安全 虚拟化
虚拟化技术:实现资源高效利用和灵活管理的利器
虚拟化技术作为实现资源高效利用和灵活管理的重要手段,在数字化时代背景下,正逐步改变传统IT架构模式。本文概述了虚拟化技术的概念、原理及其在数据中心管理、云计算平台、企业信息化建设、科研教育及医疗行业的应用,并探讨了其面临的挑战与未来发展趋势。
191 3
|
17天前
|
人工智能 负载均衡 安全
代理IP与科技创新:算力资源的灵活调度与高效利用
在数字化时代,互联网成为日常生活的一部分,高效利用算力资源至关重要。代理IP作为关键技术,在隐私保护、突破地域限制及算力调度方面展现独特优势。本文探讨代理IP与科技创新的融合,通过具体案例和代码示例展示其助力算力资源灵活调度与高效利用的应用场景,涵盖电商、金融、制造及媒体等领域,同时分析面临的挑战与解决方案。代理IP不仅优化网络流量管理,提高访问速度,还在AI算力集群中发挥多重作用,确保数据安全和通信稳定,为数字化创新提供有力支持。
63 3
|
2月前
|
关系型数据库 Serverless 分布式数据库
PolarDB Serverless 模式通过自动扩缩容技术,根据实际工作负载动态调整资源,提高系统灵活性与成本效益
PolarDB Serverless 模式通过自动扩缩容技术,根据实际工作负载动态调整资源,提高系统灵活性与成本效益。用户无需预配高固定资源,仅需为实际使用付费,有效应对流量突变,降低总体成本。示例代码展示了基本数据库操作,强调了合理规划、监控评估及结合其他云服务的重要性,助力企业数字化转型。
35 6
|
4月前
|
存储 分布式计算 监控
动态资源管理
动态资源管理
165 66
|
2月前
|
运维 Serverless 数据处理
Serverless架构通过提供更快的研发交付速度、降低成本、简化运维、优化资源利用、提供自动扩展能力、支持实时数据处理和快速原型开发等优势,为图像处理等计算密集型应用提供了一个高效、灵活且成本效益高的解决方案。
Serverless架构通过提供更快的研发交付速度、降低成本、简化运维、优化资源利用、提供自动扩展能力、支持实时数据处理和快速原型开发等优势,为图像处理等计算密集型应用提供了一个高效、灵活且成本效益高的解决方案。
103 1
|
7月前
|
Prometheus 运维 监控
解锁分布式云多集群统一监控的云上最佳实践
为应对分布式云多集群监控的挑战,阿里云可观测监控 Prometheus 版结合 ACK One,凭借高效纳管与全局监控方案有效破解了用户在该场景的监控运维痛点,为日益增长的业务需求提供了一站式、高效、统一的监控解决方案,实现成本与运维效率的双重优化。助力企业的数字化转型与业务快速增长,在复杂多变的云原生时代中航行,提供了一个强有力的罗盘与风帆。
55917 29
|
6月前
|
缓存 运维 监控
中间件资源管理
【7月更文挑战第18天】
99 5

热门文章

最新文章

下一篇
开通oss服务