gpt4 book ai didi

ssl - 如何在 Go 中缓存/重用 TLS 连接

转载 作者:数据小太阳 更新时间:2023-10-29 03:20:03 25 4
gpt4 key购买 nike

我遇到了一个问题,我在每次请求时都创建一个新连接,但效率非常低。

我想允许设置的最大数量的 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.
}
}
}

谢谢!

最佳答案

你问的是所谓的连接池。看看 Fasthttp 包源代码:https://github.com/valyala/fasthttp/blob/master/client.go .您甚至可以根据自己的目的使用此库或其他库。

您可以找到 acquireConn func这正是您所需要的:

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

关于ssl - 如何在 Go 中缓存/重用 TLS 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55427161/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com