2015-03-05 19 views
22

Sto caricando centinaia di milioni di elementi nel mio database tramite un'API REST da un server cloud su Heroku a un database in AWS EC2. Sto usando Python e vedo costantemente il seguente messaggio di registro INFO nei log.Perché vedo costantemente "Ripristinare la connessione interrotta" durante il caricamento dei dati nel mio database?

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

Questa "ripristino del collegamento caduto" sembra prendere molti secondi (a volte 30+ sec) prima del mio codice continua a eseguire di nuovo.

  • In primo luogo che cosa esattamente sta succedendo qui e perché?
  • In secondo luogo, esiste un modo per interrompere la connessione in modo che sia possibile caricare i dati più rapidamente?

Grazie per il vostro aiuto. Andrew.

risposta

3

Questa è una pratica comune per i servizi che espongono API RESTful per evitare abusi (o DoS).
Se stai sottolineando la loro API, interromperanno la tua connessione.
Provare a far dormire un po 'di script ogni tanto per evitare il rilascio.

+0

uso pallone su un computer locale e spesso sottolineare loro API, posso evitare che cada la connessione? – user1140560

8

Richieste utilizza Keep-Alive by default. Resetting dropped connection, dalla mia comprensione, significa che una connessione che dovrebbe essere viva è stata abbandonata in qualche modo. Possibili cause:

  1. Il server non supporta Keep-Alive.
  2. Non c'è trasferimento di dati nelle connessioni stabilite per un po ', quindi il server interrompe le connessioni.

Vedere https://stackoverflow.com/a/25239947/2142577 per ulteriori dettagli.

5

Il problema è in realtà che il server ha chiuso la connessione anche se il client ha richiesto che fosse mantenuto in vita.

Questo non è necessariamente perché il server non supporta keepalive, ma potrebbe essere che il server è configurato per consentire solo un certo numero di richieste su una connessione. Questo potrebbe essere fatto per aiutare a diffondere le richieste su diversi server, ma penso che questa pratica sia/era comune come una difesa pratica contro il codice scritto male che opera nel server (ad esempio PHP) che non ripulisce dopo se stesso dopo aver servito una richiesta (forse a causa di una condizione di errore ecc.)

Se pensi che questo sia il tuo caso e non desideri vedere questi registri (che sono registrati a livello INFO), puoi aggiungere quanto segue quieten quella parte della registrazione:

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