Подтвердить что ты не робот

Почему я постоянно вижу "Сброс сброшенного соединения" при загрузке данных в мою базу данных?

Я загружаю сотни миллионов элементов в свою базу данных с помощью REST API с облачного сервера на Heroku в базу данных в AWS EC2. Я использую Python, и я постоянно вижу следующее сообщение журнала INFO в журналах.

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

Этот "сброс сброшенного соединения", кажется, занимает много секунд (иногда 30 с), прежде чем мой код продолжит выполнение снова.

  • Во-первых, что именно происходит здесь и почему?
  • Во-вторых, есть ли способ прекратить соединение с тем, чтобы я мог быстрее загружать данные?

Спасибо за вашу помощь. Эндрю.

4b9b3361

Ответ 1

Запросы используют Keep-Alive по умолчанию. Resetting dropped connection, из моего понимания, означает, что соединение, которое должно быть живым, было каким-то образом отброшено. Возможные причины:

  • Сервер не поддерживает Keep-Alive.
  • Пока нет передачи данных в установленных соединениях, поэтому сервер отключает подключения.

Подробнее см. fooobar.com/questions/148126/....

Ответ 2

Проблема в том, что сервер закрыл соединение, даже если клиент запросил его сохранить.

Это не обязательно, потому что сервер не поддерживает keepalives, но может быть, что сервер настроен только для разрешения определенного количества запросов на соединение. Это может быть сделано для того, чтобы распространять запросы на разных серверах, но я думаю, что эта практика является/была обычной практической защитой от плохо написанного кода, который работает на сервере (например, 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)

Ответ 3

Это обычная практика для служб, которые предоставляют API RESTful, чтобы избежать злоупотреблений (или DoS).
Если вы подчеркиваете свой API, они потеряют ваше соединение.
Попытайтесь, чтобы ваш script поспал немного раз в то время, чтобы избежать падения.