【问题标题】:How to cache/reuse TLS connections in Go如何在 Go 中缓存/重用 TLS 连接
【发布时间】:2019-08-20 23:15:29
【问题描述】:

我遇到了一个问题,我为每个请求创建一个新连接,而且效率非常低。

我想允许设置的最大 TLS 连接数一次在我的客户端上保持打开/缓存。当数据准备好传输时,它首先检查是否有空闲连接,然后检查是否可以创建新连接(即打开的连接数

这是我想到的一些(糟糕的)伪代码。可以给点建议吗?

func newTLSConnection(netDialer, host, tlsConfig) (tls.Con) {

    // Set up the certs
    // ...

    // Make A TLS Connection
    con, _ := tls.DialWithDialer(netDialer, "tcp", host, tlsConfig)

    return con
}

func (con tls.Con) Do (someData []byte) {

    // If con 
    // Send some date to the server
    _, _ := con.Write(someData)

    // Get response from server
    response := make([]byte, 100)
    _, _ := io.ReadFull(con, response)

    return
}


main(){
    var cons []tls.Con
    maxConSize := 3

    while {

        if allConsInSliceAreBusy() && len(cons) < maxConSize{
            newCon = NewTLSConnection(...)
            cons = append(cons, newCon)
            conToUse := newCon

            conToUse.Do([]byte("stuff"))

        } else if !allConsInSliceAreBusy() {

            conToUse := firstOpenConInCons()

            conToUse.Do([]byte("stuff"))

        } else{
             // NOP. Max cons created and they are all busy.
             // Wait for one to become idle or close.
        }
    }
}

谢谢!

【问题讨论】:

  • 代码 sn-p 不可读...你想用这行 func (con tls.Con) Do (someData []byte) 做什么??
  • Do 函数通过 TLS 连接发送数据并读取响应。

标签: ssl go tcp tls1.2


【解决方案1】:

您所询问的内容称为连接池。查看 Fasthttp 包源代码:https://github.com/valyala/fasthttp/blob/master/client.go。您甚至可以将这个库或其他库用于您的目的。

您可以找到acquireConn func,它可以满足您的需求:

  • 锁定连接池以允许并发执行。
  • 如果池为空,则创建新连接(从池中拉出新连接)。
  • 在 TTL 超时的情况下清理连接。

【讨论】:

  • 我们应该停止发布指向master 的链接。那个链接现在已经失效了。
猜你喜欢
  • 2013-07-30
  • 2018-01-15
  • 1970-01-01
  • 1970-01-01
  • 2014-04-08
  • 2021-06-09
  • 1970-01-01
  • 2018-11-22
  • 1970-01-01
相关资源
最近更新 更多