Golang HTTP 持久连接

posts/golang-http%E6%8C%81%E4%B9%85%E8%BF%9E%E6%8E%A5

TCP 连接设置中的三次握手会带来很大的性能损失,重用已创建的连接是一项应当考虑的优化。

Keep-Alive 是一种允许 HTTP 会话使用相同的 TCP 连接的优化方式。 大多数服务器和客户端都允许配置和选项来利用这种优化。Go 的 HTTP Client 默认是开启 Keep-Alive 的,但是在复杂的使用场景下会导致失效。

我们可以通过配置 Transport 中的一些参数来实现更稳定的持久连接。

package client

import (
	"net/http"
	"time"
)

var Instance = New()

func New() *http.Client {
	t := http.DefaultTransport.(*http.Transport).Clone()
	t.MaxIdleConns = 200
	t.MaxConnsPerHost = 10
	t.MaxIdleConnsPerHost = 10
	t.IdleConnTimeout = 5 * time.Minute
	return &http.Client{
		Timeout:   30 * time.Second,
		Transport: t,
	}
}

其中 MaxIdleConnsPerHost 的数值默认值为 2,为 RFC2616 建议的单个客户端发起的持久连接数。不过实际情况下为了建立更多连接这个数值可能会大于 2。

参考链接