Golang连接池应用实践

news/2024/6/17 10:23:20 标签: golang, kafka, 开发语言

1.背景介绍

服务和服务之间的连接是开发过程中很常见的操作,为了服务解耦,减少相互依赖,增强系统稳定性,灵活性,所以会增加许许多多的服务通信链路,随着服务通信链路的增加,网络通信次数就会成倍的增长,那么随之而来的就是网络资源的消耗加剧,例如:带宽,连接数以及cpu,内存等,那么怎么在保证系统灵活稳定的前提下,保证服务间通信尽可能的高效低耗是我们本片文字要解决的核心问题。

2.问题分析

在我们服务中,有http服务,有rpc服务,这些服务大致可以分为两类做拆分,一类是同步服务,另外一类是异步服务。

1.异步服务

当我们将一个服务通过消息中间件(例如kafka)解耦的时候,那么一个服务会变成多个异步服务,服务和服务之间是依靠kafka传输数据,服务和kafka之间是tcp连接,如果我们大量使用tcp连接和kafka通信,那么随着请求数的增加,业务服务和kafka的压力都会倍增,系统稳定性根本无法谈起。

2.同步服务

当我们想把一个同步服务会变成多个同步服务,服务和服务之间是依靠tcp传输数据,也会存在大量使用tcp连接通信的情况,随着请求数的增加,业务服务的压力会倍增,系统稳定性也无法保证。

3.连接解读

那么从连接的本质去研究探索解决方案:

一、每个连接建立时都会申请内存用来做socket buffer

二、每个连接都要做三次握手四次挥手

三、每个连接关闭时都要释放内存空间

四、并发高时,会产生大量的连接,影响系统调度,会占用太多系统资源

4.突破点

通过问题分析中的连接解读,可以很容易找到几个突破点:

    • buffer复用
      - 减少握手和挥手次数
      - 减少连接关闭
      - 减少连接数量

5.连接池的功能点

通过以上几个突破点,我们可以开发个连接池,具备以下功能:

    • 保持连接数固定,可以弹性调整
      - 延长连接的生命周期
      - 连接可以被多次复用

3.连接池(connPool)的应用

创建连接池

connPool = connPool.NewConnPool(&connPool.Options{
    Dialer:             dial,                   //dial拨号方法
    PoolSize:           200,                    //连接池的最大连接数
    PoolTimeout:        time.Second * 250,      //等待连接分配的超时时间
    IdleTimeout:        time.Second * 100,      //每个连接的存活超时时间
    IdleCheckFrequency: time.Millisecond * 500, //检测连接存活频率
})
func dial() (conn net.Conn, err error) {        //拨号方法
    ...
    conn, err = net.DialTimeout(...)
    ...
}

连接获取和回收

func release() {                                       
    conn, _, err = connPool.GetConn(pool)               //从连接池里获取连接
    ...
    _, e := conn.ReleaseConn(pool, err, isBadConn)      //释放连接到连接池
    ...
}()
 
func isBadConn(err error) bool {                        //判断连接是否失效
    if _, ok := err.(*net.OpError); ok {
        return true
    }
    return false
}

4.流程图

1


http://www.niftyadmin.cn/n/147428.html

相关文章

springboot+vue药物药品进销存管理系统

此系统主要分为四大模块:系统管理模块、进货管理模块、销售管理模块和库存管理模块。对于系统管理模块来说,系统管理模块具有用户登录、密码修改以及退出系统的功能;对于进货管理模块来说,有药品需求的时候,将所需要的…

【python】采集文库VIP数据并保存PDF,再不为钱发愁

前言 是谁!!在搜几千字的文档资料只能看25%… 是谁!!在百度文库找七找八的时候所有的东西都要付费才能继续看… 是谁!!是谁在网页上搜索往年考试卷题答案的时候只能阅读前两页的选择题… 原来是我自己~我…

【初学者】Git?Github?从此 Git 心中有数

一、清白 Git / Github Git 是 Linux 之父为了解决 Linux 混乱的代码管理被迫开发出来的,真牛! Git 是当前最先进、最主流的分布式版本控制系统且免费、开源!可以帮你保存文件的所有修改记录、并使用版本号进行区分。你也可以随时通过指令浏…

python -- 批量读取多个文件,并将每个文件中相同变量累加

python – 批量读取多个文件,并将每个文件中相同变量累加 情况描述 现有多个nc文件,位于同一个文件夹中,如下所示每个文件中都有相同的变量,想要读取每个文件中的变量然后将其加起来意思就是说: 文件1中的变量文件2中…

为什么00后都不知道什么是报销?

一提到00后,新新人类就是他们的代名词。一度“整顿职场”的操作,让很多企业管理者头疼。作为后援团团长的管理者面对公司的业务新生力量--营收青年近卫团,应当帮助他们披荆斩棘、团灭障碍。正如无尽垫款、机械填单、繁琐对账,传统…

SaaS产品设计方法论

写在前面 有这样一个场景 ⽼板/⽤户:我有⼀个特别棒的想法,优先级很⾼,你赶紧把⽅案产做出来。 产品经理:保证效率!我⻢上就开始画原型,然后内部评审,接着推进开发。 这时候部分产品经理急于表现,需要将需求快速落地,第⼀反应就是开始执⾏,所以经常会发⽣⼀种情况,产…

Spring Boot restart logging.config logback JNDI RCE漏洞复现

声明:本文仅供学习参考,其中涉及的一切资源均来源于网络,请勿用于任何非法行为,否则您将自行承担相应后果,本人不承担任何法律及连带责任。 搭建环境 漏洞环境:https://github.com/LandGrey/SpringBootVu…

LearnOpenGL-高级OpenGL-5.帧缓冲

本人刚学OpenGL不久且自学,文中定有代码、术语等错误,欢迎指正 我写的项目地址:https://github.com/liujianjie/LearnOpenGLProject 文章目录简单理解帧缓冲创建一个帧缓冲纹理附件渲染缓冲对象附件例子1-渲染到帧缓冲的颜色纹理后期处理例子…