猿问

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

我有 1000-2000 个网页要从一台服务器下载,我正在使用 go 例程和通道来实现高效率。问题是每次我运行我的程序时,最多 400 个请求都会失败,并出现错误“对等方重置连接”。很少(可能 10 次中有 1 次)没有请求失败。

我能做些什么来防止这种情况发生?

有趣的一件事是,当我在与托管网站的服务器位于同一国家/地区的服务器上运行该程序时,0 个请求失败,所以我猜测延迟存在一些问题(因为它现在运行在服务器在不同的大陆)。

我使用的代码基本上只是一个简单的 http.Get(url) 请求,没有额外的参数或自定义客户端。


慕勒3428872
浏览 180回答 3
3回答

UYOU

该消息connection reset by peer表明远程服务器发送了一个RST强制关闭连接,或者是故意作为限制连接的机制,或者是由于缺乏资源。无论哪种方式,您都可能打开太多连接,或者重新连接太快。并行启动 1000-2000 个连接很少是下载这么多页面的最有效方式,尤其是当大部分或全部来自单个服务器时。如果您测试吞吐量,您会发现最佳并发级别要低得多。您还需要设置Transport.MaxIdleConnsPerHost以匹配您的并发级别。如果MaxIdleConnsPerHost低于预期的并发连接数,服务器连接通常会在请求后关闭,然后立即再次打开——这将显着减慢您的进度,并可能达到服务器施加的连接限制。

12345678_0001

仍然是一个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/")}

森栏

MaxConnsPerHost通过设置运输选项,我得到了很好的结果......cl := &http.Client{    Transport: &http.Transport{MaxConnsPerHost: 50}}MaxConnsPerHost 可以选择限制每个主机的连接总数,包括处于拨号、活动和空闲状态的连接。违反限制时,拨号将阻塞。https://golang.org/pkg/net/http/#Transport.MaxConnsPerHost编辑:为了澄清,这个选项是在 Go 1.11 中发布的,在上面@AG1 或@JimB 的答案时不可用,因此我发布了这个。
随时随地看视频慕课网APP

相关分类

Go
我要回答