2015-03-02 13 views
6

Trong khi nghiên cứu một số vấn đề lạ với ứng dụng web Python của tôi (đặc biệt, các vấn đề liên quan đến kết nối MongoDB), tôi nhận thấy một cái gì đó on the official PyMongo documentation page. Ứng dụng web của tôi sử dụng Flask, nhưng điều này không ảnh hưởng đến vấn đề tôi đang gặp phải.Tại sao PyMongo ném AutoReconnect?

Trình điều khiển PyMongo thực hiện kết nối tổng hợp, nhưng nó cũng ném một ngoại lệ (AutoReconnect) khi kết nối cũ và kết nối lại là do.

Nó nói rằng (về ngoại lệ AutoReconnect):

Để tự động kết nối lại bạn phải xử lý ngoại lệ này, công nhận rằng hoạt động đó gây ra nó đã không nhất thiết phải thành công. Các hoạt động trong tương lai sẽ cố mở một kết nối mới tới cơ sở dữ liệu (và sẽ tiếp tục tăng ngoại lệ này cho đến khi kết nối thành công đầu tiên được thực hiện).

Tôi nhận thấy rằng điều này thực sự xảy ra liên tục (và có vẻ như không phải là lỗi). Các kết nối được đóng bởi máy chủ MongoDB sau những gì có vẻ như vài phút không hoạt động, và cần được tái tạo bởi ứng dụng web.

Điều tôi không hiểu tại sao trình điều khiển PyMongo ném lỗi khi nó kết nối lại (mà người dùng của trình điều khiển cần tự xử lý), thay vì làm điều đó một cách minh bạch. (Thậm chí có thể có một tùy chọn mà người dùng có thể đặt để các trường hợp ngoại lệ AutoReconnectlàm bị ném, nhưng không phải là một mặc định hợp lý được rằng những ngoại lệ này không bị ném và kết nối được tái tạo liên tục?)

Tôi chưa bao giờ gặp phải hành vi này bằng các hệ thống cơ sở dữ liệu khác, đó là lý do tại sao tôi hơi bối rối. Cũng cần lưu ý rằng các kết nối MongoDB của ứng dụng web của tôi không bao giờ thất bại khi kết nối với máy chủ MongoDB phát triển cục bộ của tôi (tôi cho rằng nó có liên quan đến thực tế là nó là kết nối cục bộ và kết nối được thực hiện thông qua một kết nối địa phương). UNIX socket thay vì socket mạng, nhưng tôi có thể sai).

+1

Các nhà phát triển trình điều khiển Python đã giải quyết Autoreconnect một vài lần trong các vấn đề JIRA. Hãy xem [PYTHON-197] (https://jira.mongodb.org/browse/PYTHON-197), để bắt đầu. Nếu bạn đọc qua những gì đã có trong JIRA về Autoreconnect và không hài lòng, tôi sẽ mở một vé PYTHON. – wdberkeley

+0

Cảm ơn bạn đã chỉ ra điều đó!Nó cảm thấy như thể những người không dùng năng lượng như bản thân tôi, những người không hoạt động toàn bộ cụm sao chép đã được nhân bản đã bị bỏ đi. Bạn có biết tại sao những kết nối đó thực sự hết thời gian không? Không nên họ thất bại ngay lập tức nếu các ổ cắm được đóng lại? –

+1

Tôi không thể nói bất cứ điều gì về lý do tại sao các kết nối bị lỗi mà không có nhiều thông tin hơn. Có bất cứ điều gì trong mongod các bản ghi về các kết nối được đóng lại? – wdberkeley

Trả lời

6

Bạn đang hiểu nhầm AutoReconnect. Nó được nâng lên khi trình điều khiển cố gắng giao tiếp với máy chủ (để gửi lệnh hoặc hoạt động khác) và sự cố mạng hoặc sự cố tương tự xảy ra. Tên của ngoại lệ có nghĩa là để thông báo rằng bạn không phải tạo một phiên bản mới của MongoClient, ứng dụng khách hiện tại sẽ cố kết nối lại tự động khi ứng dụng của bạn thử hoạt động tiếp theo. Nếu cùng một vấn đề xảy ra, AutoReconnect được nâng lên một lần nữa.

Tôi nghi ngờ lý do bạn thấy thời gian chờ của ổ cắm (và AutoReconnect được nâng lên) là có cân bằng tải giữa máy chủ và ứng dụng của bạn đóng kết nối sau một khoảng thời gian không hoạt động. Ví dụ, điều này dường như xảy ra trên nền tảng Azure của Microsoft sau 13 phút không hoạt động trên ổ cắm. Bạn có thể sửa lỗi này bằng cách sử dụng tùy chọn socketKeepAlive, được thêm vào trong PyMongo 2.8. Lưu ý rằng bạn cũng sẽ phải đặt khoảng thời gian lưu giữ trên máy chủ ứng dụng của bạn thành một giá trị thích hợp (mặc định trên Linux là 2 giờ). See here for more information.

+0

Đó chính xác là vấn đề (cụ thể là Azure). Chúng tôi đang ở trên AWS bây giờ và tôi đã không nhìn thấy vấn đề này nữa. Cảm ơn bạn về thông tin! –

Các vấn đề liên quan