首页 > 文章列表 > 转到 http.Get、并发和“对等方重置连接”

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

golang
474 2023-03-08

问题内容

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

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

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

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

正确答案

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

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

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