¿Por qué constantemente veo “Restablecer la conexión interrumpida” al cargar datos en mi base de datos?

Estoy cargando cientos de millones de artículos a mi base de datos a través de una API REST desde un servidor en la nube en Heroku a una base de datos en AWS EC2. Estoy usando Python y constantemente veo el siguiente mensaje de registro de INFO en los registros.

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

Este “restablecimiento de la conexión interrumpida” parece tardar muchos segundos (a veces más de 30 segundos) antes de que mi código continúe ejecutándose de nuevo.

  • En primer lugar, ¿qué está pasando exactamente aquí y por qué?
  • En segundo lugar, ¿hay una manera de evitar que la conexión se caiga para poder cargar los datos más rápido?

Gracias por tu ayuda. Andrés.

Las solicitudes utilizan Keep-Alive de forma predeterminada . Resetting dropped connection , a mi entender, significa que una conexión que debería estar activa se eliminó de alguna manera. Las posibles razones son:

  1. El servidor no es compatible con Keep-Alive .
  2. No hay transferencia de datos en las conexiones establecidas por un tiempo, por lo que el servidor elimina las conexiones.

Consulte https://stackoverflow.com/a/25239947/2142577 para obtener más detalles.

El problema realmente es que el servidor ha cerrado la conexión a pesar de que el cliente ha solicitado que se mantenga vivo.

Esto no es necesariamente porque el servidor no admite keepalives, pero puede ser que el servidor esté configurado para permitir solo un cierto número de solicitudes en una conexión. Esto podría hacerse para ayudar a distribuir las solicitudes en diferentes servidores, pero creo que esta práctica es / fue una práctica como defensa práctica contra el código mal escrito que opera en el servidor (por ejemplo, PHP) que no se limpia después de servir. una solicitud (tal vez debido a una condición de error, etc.)

Si cree que este es su caso y desea no ver estos registros (que se registran a nivel de INFO), puede agregar lo siguiente para acallar esa parte del registro:

 # 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) 

Esta es una práctica común para los servicios que exponen las API REST para evitar el abuso (o DoS).
Si estás enfatizando su API, ellos caerán tu conexión.
Intenta que el script se duerma un poco de vez en cuando para evitar que se caiga.