为什么我经常看到"重置断开连接"将数据上传到我的数据库?

时间:2015-03-05 00:27:32

标签: python http connection-pooling python-requests urllib3

我正在通过REST API从Heroku上的云服务器向AWS EC2中的数据库上传数亿个项目到我的数据库。我正在使用Python,并且我不断在日志中看到以下INFO日志消息。

[requests.packages.urllib3.connectionpool] [INFO] Resetting dropped connection: <hostname>

在我的代码继续执行之前,这个“重置已断开的连接”似乎需要几秒钟(有时30秒以上)。

  • 首先,这里到底发生了什么?为什么?
  • 其次有没有办法阻止连接丢失,以便我能够更快地上传数据?

感谢您的帮助。 安德鲁。

3 个答案:

答案 0 :(得分:12)

请求使用Keep-Alive by default。根据我的理解,Resetting dropped connection意味着应该活着的连接以某种方式被删除。可能的原因是:

  1. 服务器不支持Keep-Alive
  2. 一段时间内已建立的连接中没有数据传输,因此服务器会断开连接。
  3. 有关详细信息,请参阅https://stackoverflow.com/a/25239947/2142577

答案 1 :(得分:10)

问题实际上是服务器已关闭连接,即使客户端已请求它保持活动状态。

这不一定是因为服务器不支持keepalive,但可能是服务器配置为仅允许连接上的特定数量的请求。这样做可以帮助在不同的服务器上分散请求,但我认为这种做法是常见的,可以防止在服务器中运行的编写不良的代码(例如PHP)在服务后不能自行清理请求(可能是由于错误条件等)

如果您认为这种情况就是这种情况,并且您不希望看到这些日志(在INFO级别记录),那么您可以添加以下内容来平息该部分日志记录:

# Really don't need to hear about connections being brought up again after server has closed it
logging.getLogger("requests.packages.urllib3.connectionpool").setLevel(logging.WARNING)

答案 2 :(得分:4)

这是公开RESTful API以避免滥用(或DoS)的服务的常见做法 如果你强调他们的API,他们就会放弃你的连接。
尝试让你的脚本偶尔睡一会儿以避免跌落。