为了账号安全,请及时绑定邮箱和手机立即绑定

转到 http.Get、并发和“对等方重置连接”

转到 http.Get、并发和“对等方重置连接”

Go
慕勒3428872 2022-01-17 17:58:28
我有 1000-2000 个网页要从一台服务器下载,我正在使用 go 例程和通道来实现高效率。问题是每次我运行我的程序时,最多 400 个请求都会失败,并出现错误“对等方重置连接”。很少(可能 10 次中有 1 次)没有请求失败。我能做些什么来防止这种情况发生?有趣的一件事是,当我在与托管网站的服务器位于同一国家/地区的服务器上运行该程序时,0 个请求失败,所以我猜测延迟存在一些问题(因为它现在运行在服务器在不同的大陆)。我使用的代码基本上只是一个简单的 http.Get(url) 请求,没有额外的参数或自定义客户端。
查看完整描述

3 回答

?
UYOU

TA贡献1878条经验 获得超4个赞

该消息connection reset by peer表明远程服务器发送了一个RST强制关闭连接,或者是故意作为限制连接的机制,或者是由于缺乏资源。无论哪种方式,您都可能打开太多连接,或者重新连接太快。

并行启动 1000-2000 个连接很少是下载这么多页面的最有效方式,尤其是当大部分或全部来自单个服务器时。如果您测试吞吐量,您会发现最佳并发级别要低得多。

您还需要设置Transport.MaxIdleConnsPerHost以匹配您的并发级别。如果MaxIdleConnsPerHost低于预期的并发连接数,服务器连接通常会在请求后关闭,然后立即再次打开——这将显着减慢您的进度,并可能达到服务器施加的连接限制。



查看完整回答
反对 回复 2022-01-17
?
12345678_0001

TA贡献1802条经验 获得超5个赞

仍然是一个golang新手,希望这会有所帮助。


var netClient = &http.Client{}


func init() {

    tr := &http.Transport{

        MaxIdleConns:       20,

        MaxIdleConnsPerHost:  20,

    }

    netClient = &http.Client{Transport: tr}

}


func foo() {

    resp, err := netClient.Get("http://www.example.com/")

}


查看完整回答
反对 回复 2022-01-17
?
森栏

TA贡献1810条经验 获得超5个赞

MaxConnsPerHost通过设置运输选项,我得到了很好的结果......


cl := &http.Client{

    Transport: &http.Transport{MaxConnsPerHost: 50}

}

MaxConnsPerHost 可以选择限制每个主机的连接总数,包括处于拨号、活动和空闲状态的连接。违反限制时,拨号将阻塞。


https://golang.org/pkg/net/http/#Transport.MaxConnsPerHost


编辑:为了澄清,这个选项是在 Go 1.11 中发布的,在上面@AG1 或@JimB 的答案时不可用,因此我发布了这个。


查看完整回答
反对 回复 2022-01-17
  • 3 回答
  • 0 关注
  • 179 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信