在业务上使用 http 访问,需要初始化 httpClient,其中在高并发场景下,MaxIdleConns 与 MaxIdleConnsPerHost 的配置会影响业务的请求效率。
Client.Transports 属性中包含:
- MaxIdleConns 所有 host 的连接池最大连接数量,默认无穷大
- MaxIdleConnsPerHost 每个 host 的连接池最大空闲连接数, 默认 2
- MaxConnsPerHost 对每个 host 的最大连接数量,0 表示不限制
相对应的代码解释 (/src/net/http/transport.go:193:198:210)
// MaxIdleConns controls the maximum number of idle (keep-alive)
// connections across all hosts. Zero means no limit.
MaxIdleConns int
// MaxIdleConnsPerHost, if non-zero, controls the maximum idle
// (keep-alive) connections to keep per-host. If zero,
// DefaultMaxIdleConnsPerHost is used.
MaxIdleConnsPerHost int
// MaxConnsPerHost optionally limits the total number of
// connections per host, including connections in the dialing,
// active, and idle states. On limit violation, dials will block.
//
// Zero means no limit.
//
// For HTTP/2, this currently only controls the number of new
// connections being created at a time, instead of the total
// number. In practice, hosts using HTTP/2 only have about one
// idle connection, though.
MaxConnsPerHost int
测试:
如果 MaxConnsPerHost=1,则只有一个 http client 被创建.
如果 MaxIdleConnsPerHost=1,则会缓存一个 http client.
golang 中默认 http.client
newClient := &http.Client{
Timeout: time.Minute * 1, // 设置超时时间
Transport: &http.Transport{
Dial: (&net.Dialer{
Timeout: 30 * time.Second, // 限制建立 TCP 连接的时间
KeepAlive: 30 * time.Second,
}).Dial,
TLSHandshakeTimeout: 10 * time.Second, // 限制 TLS 握手的时间
ResponseHeaderTimeout: 10 time.Second, // 限制读取 response header 的时间, 默认 timeout + 5time.Second
ExpectContinueTimeout: 1 * time.Second, // 限制 client 在发送包含 Expect: 100-continue 的 header 到收到继续发送 body 的 response 之间的时间等待。
MaxIdleConns: 2, // 所有 host 的连接池最大连接数量,默认无穷大
MaxIdleConnsPerHost: 1, // 每个 host 的连接池最大空闲连接数, 默认 2
MaxConnsPerHost: 1, // 每个 host 的最大连接数量
IdleConnTimeout: 3 * time.Minute, //how long an idle connection is kept in the connection pool.
},
}
原创声明,本文系作者授权云 + 社区发表,未经许可,不得转载。
如有侵权,请联系 yunjia_community@tencent.com 删除。
https://cloud.tencent.com/developer/article/1684426