2015-03-05 10 views
22

Przesyłam setki milionów produktów do mojej bazy danych za pośrednictwem interfejsu REST API z serwera w chmurze na Heroku do bazy danych w AWS EC2. Używam Pythona i ciągle widzę następujący komunikat dziennika w dziennikach.Dlaczego ciągle wyświetla się "Resetting upuszczonego połączenia" podczas przesyłania danych do mojej bazy danych?

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

Ten „resetowanie spadła połączenia” wydaje się mieć wiele sekund (czasem 30+ sekund) zanim mój kod kontynuuje ponownie wykonać.

  • Po pierwsze, co dokładnie się tutaj dzieje i dlaczego?
  • Po drugie, czy istnieje sposób na przerwanie przesyłania połączenia, aby umożliwić szybsze przesyłanie danych?

Dzięki za pomoc. Andrew.

Odpowiedz

3

Jest to powszechna praktyka w przypadku usług, które eksponują interfejsy API RESTful w celu uniknięcia nadużyć (lub DoS).
Jeśli podkreślisz swój interfejs API, usunie to połączenie.
Spróbuj odłożyć swój skrypt do kosza, co jakiś czas, aby uniknąć upuszczenia.

+0

Używam kolby na komputerze lokalnym i często podkreślam ich API, czy mogę uniemożliwić mu zerwanie połączenia? – user1140560

8

Żądania używają Keep-Alive by default. Resetting dropped connection, z mojego zrozumienia, oznacza, że ​​połączenie, które powinno być żywe zostało jakoś usunięte. Możliwe przyczyny:

  1. Serwer nie obsługuje Keep-Alive.
  2. Przez pewien czas nie ma transferu danych w ustanowionych połączeniach, więc serwer zrzuca połączenia.

Aby uzyskać więcej informacji, patrz https://stackoverflow.com/a/25239947/2142577.

5

Problem polega na tym, że serwer zamknął połączenie, mimo że klient zażądał jego utrzymania.

Niekoniecznie, ponieważ serwer nie obsługuje keepalives, ale może być tak, że serwer jest skonfigurowany tak, aby zezwalał tylko na określoną liczbę żądań połączenia. Można to zrobić, aby ułatwić rozłożenie żądań na różne serwery, ale myślę, że ta praktyka jest/była powszechna jako praktyczna obrona przed źle napisanym kodem, który działa na serwerze (np. PHP), który nie oczyszcza się po nim po podaniu żądanie (być może z powodu błędu itp.)

Jeśli uważasz, że tak jest w Twoim przypadku i nie chcesz widzieć tych dzienników (które są rejestrowane na poziomie INFO), możesz dodać następujące informacje aby wyciszyć tę część rejestrowania:

# 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) 
Powiązane problemy