Go标准库高并发HTTP请求出现EOF错误
线上服务经常规律性的出现http.Client请求服务器数据和上报数据时报Connection Reset by peer 和 EOF 错误,
原因
通过lvs-ngin代理转发,存在并发连接数限制,当达到限制时服务器会关闭其中一些连接; 同时客户端请求存在连接复用,如果在收到关闭之前复用了连接就会出现Connection Reset by peer; EOF错误发生在请求建立后读取时,此时服务器已经关闭连接,客户端还没有检测到关闭前读取数据;
解决方法有三:
在请求时关闭连接复用,每次都使用新的连接;
req, err := NewRequest("POST", url, body) req.Close = true
头部设置连接为关闭状态
req, err := NewRequest("POST", url, body) req.Header.Add("Connection", "close")
使用 Transport 取消 HTTP利用连接 DisableKeepAlives 为true时,当前连接只会使用一次
tr := http.Transport{DisableKeepAlives: true} client := http.Client{Transport: &tr} client.Get(url)
[Go] Golang http.Client请求程序遇到 Connection Reset by Peer 或 EOF 问题
https://piaohua.github.io/post/golang/20200814-golang-connection-reset-by-peer/