一尘不染

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

go

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

我该怎么做才能防止这种情况?

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

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


阅读 254

收藏
2020-07-02

共1个答案

一尘不染

该消息connection reset by peer表明远程服务器发送了一个RST以强制关闭连接的方式,这是有意限制连接的机制,或者是由于资源不足而导致的。无论哪种方式,您可能打开太多的连接,或者重新连接的速度太快。

并行启动1000-2000个连接很少是下载那么多页面的最有效方法,特别是如果大多数或全部来自单个服务器时。如果您测试吞吐量,您会发现一个较低的最佳并发级别。

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

2020-07-02