在业务上使用 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