我可以从一台服务器上下载1000-2000个网页,并且我正在使用go例程和通道来实现高效率。问题是,每次我运行程序时,多达400个请求都会失败,并显示错误“对等连接重置”。很少(可能是十分之一),没有请求失败。
我该怎么做才能防止这种情况?
有趣的一件事是,当我在与托管该网站的服务器所在的国家/地区的服务器上运行该程序时,0个请求失败,所以我猜测延迟存在一些问题(因为它现在正在运行另一大陆上的服务器)。
我使用的代码基本上只是一个简单的http.Get(url)请求,没有额外的参数或自定义客户端。
该消息connection reset by peer表明远程服务器发送了一个RST以强制关闭连接的方式,这是有意限制连接的机制,或者是由于资源不足而导致的。无论哪种方式,您可能打开太多的连接,或者重新连接的速度太快。
connection reset by peer
RST
并行启动1000-2000个连接很少是下载那么多页面的最有效方法,特别是如果大多数或全部来自单个服务器时。如果您测试吞吐量,您会发现一个较低的最佳并发级别。
您还需要将设置Transport.MaxIdleConnsPerHost为与您的并发级别相匹配。如果MaxIdleConnsPerHost低于预期的并发连接数,则服务器连接通常会在请求后关闭,而仅立即再次打开- 这将大大减慢您的进度,并可能达到服务器施加的连接限制。
Transport.MaxIdleConnsPerHost
MaxIdleConnsPerHost