2015-03-05 12 views
22

Tôi đang tải lên hàng trăm triệu mục vào cơ sở dữ liệu của mình thông qua API REST từ máy chủ đám mây trên Heroku đến cơ sở dữ liệu trong AWS EC2. Tôi đang sử dụng Python và tôi liên tục thấy thông báo nhật ký INFO sau trong nhật ký.Tại sao tôi liên tục thấy "Đặt lại kết nối bị giảm" khi tải dữ liệu lên cơ sở dữ liệu của tôi?

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

Điều này "đặt lại kết nối bị bỏ" có vẻ mất nhiều giây (đôi khi 30 giây) trước khi mã của tôi tiếp tục thực hiện lại.

  • Thứ nhất chính xác những gì đang xảy ra ở đây và tại sao?
  • Thứ hai là có cách nào để ngăn kết nối không bị rơi để tôi có thể tải lên dữ liệu nhanh hơn?

Cảm ơn sự giúp đỡ của bạn. Andrew.

Trả lời

3

Đây là thực tiễn phổ biến cho các dịch vụ hiển thị API RESTful để tránh lạm dụng (hoặc DoS).
Nếu bạn đang nhấn mạnh API của họ, họ sẽ xóa kết nối của bạn.
Hãy thử tập lệnh của bạn để ngủ một chút mỗi lần trong một thời gian để tránh sự sụt giảm.

+0

Tôi sử dụng bình trên máy cục bộ và tôi thường nhấn mạnh API của mình, tôi có thể ngăn không cho nó kết nối không? – user1140560

8

Yêu cầu sử dụng Keep-Alive by default. Resetting dropped connection, từ sự hiểu biết của tôi, có nghĩa là một kết nối nên được sống đã được giảm xuống bằng cách nào đó. Lý do có thể là:

  1. Máy chủ không hỗ trợ Keep-Alive.
  2. Không có truyền dữ liệu trong các kết nối được thiết lập trong một thời gian, do đó máy chủ sẽ ngắt kết nối.

Xem https://stackoverflow.com/a/25239947/2142577 để biết thêm chi tiết.

5

Vấn đề thực sự là máy chủ đã đóng kết nối mặc dù khách hàng đã yêu cầu nó được giữ nguyên.

Điều này không nhất thiết vì máy chủ không hỗ trợ keepalives, nhưng có thể máy chủ được cấu hình để chỉ cho phép một số yêu cầu nhất định trên kết nối. Điều này có thể được thực hiện để giúp phát tán các yêu cầu trên các máy chủ khác nhau, nhưng tôi nghĩ thực tế này là một biện pháp phòng vệ thực tế chống lại mã viết kém hoạt động trong máy chủ (ví dụ: PHP). một yêu cầu (có thể do một điều kiện lỗi, vv)

Nếu bạn nghĩ rằng đây là trường hợp của bạn và bạn không muốn xem các nhật ký này (được ghi ở mức INFO), thì bạn có thể thêm để làm yên phần đó của quá trình ghi nhật ký:

# 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) 
Các vấn đề liên quan