我遇到很多错误,如下所述,

阅读tcp xx.xx.xx.xx:80:使用封闭的网络连接

读取tcp xx.xx.xx.xx:80:对等方重置连接

// HTTP连接功能

更新(7月14日):

服务器:NumCPU = 8,RAM = 24GB,GO = go1.4.2.linux-amd64

在一些人流较多的地方,我会收到这样的错误。
每分钟20000-30000个请求,我有500ms的时间范围来从第三方api获取响应。

我服务器上的netstat状态(使用:netstat -nat | awk'{print $ 6}'| sort | uniq -c | sort -n)来获取频率

sysctl -p


当通过Internet进行高速连接时,很可能会遇到一些连接问题。您无法完全缓解它们,因此您可能希望在请求周围添加重试逻辑。此时的实际错误类型可能无关紧要,但是如果要具体说明,则匹配use of closed network connectionconnection reset by peer的错误字符串是最好的。确保通过回退来限制重试次数,因为某些系统会断开或重置连接以限制请求速率,并且重新连接的速度越快,您可能会遇到更多错误。

根据要与之通信的远程主机的数量,您需要增加Transport.MaxIdleConnsPerHost(默认值仅为2)。与您交谈的主机越少,您可以设置的越高。这将减少建立的新连接的数量,并总体上加快请求。

如果可以,请尝试go1.5 beta。保持活动连接周围发生了一些更改,这些更改可能有助于减少您看到的错误数量。


我建议在电线一侧实施指数补偿或其他速率限制机制。对于这些错误,您实际上无能为力,而且使用指数退避也不一定会使您更快地获取数据。但这可以确保您获取所有数据,并且从中提取的API肯定会减少流量。这是我在GitHub上找到的链接。 https://github.com/cenkalti/backoff

还有一个受欢迎的选择,尽管我也没有使用过。自己实施也不是那么困难,我可以根据要求提供一些示例。根据我的经验,我建议做的一件事是确保您正在使用具有中止通道的重试功能。如果退回时间真的很长,那么您将需要某种方式让呼叫者杀死它。