2015-03-02 7 views
6

मेरे पायथन वेब एप्लिकेशन (विशेष रूप से, मोंगोडीबी कनेक्टिविटी के संबंध में मुद्दों) के साथ कुछ अजीब मुद्दों पर शोध करते समय, मैंने कुछ on the official PyMongo documentation page देखा। मेरा वेब एप्लिकेशन फ्लास्क का उपयोग करता है, लेकिन इससे मुझे जिस समस्या का सामना करना पड़ रहा है उसे प्रभावित नहीं करना चाहिए।PyMongo ऑटो रीकनेक्ट क्यों फेंकता है?

पायमोंगो ड्राइवर कनेक्शन पूलिंग करता है, लेकिन यह एक अपवाद (AutoReconnect) भी फेंकता है जब कनेक्शन खराब हो जाता है और पुनः कनेक्ट होता है।

यह कहा गया है कि (AutoReconnect अपवाद के बारे में):

करने के लिए स्वत: पुन: कनेक्ट आप इस अपवाद संभाल चाहिए, कि आपरेशन जो यह कारण जरूरी सफल नहीं है पहचानने। भविष्य के संचालन डेटाबेस में एक नया कनेक्शन खोलने का प्रयास करेंगे (और पहले सफल कनेक्शन किए जाने तक इस अपवाद को जारी रखना जारी रखेंगे)।

मैंने देखा है कि यह वास्तव में लगातार होता है (और यह एक त्रुटि प्रतीत नहीं होता है)। कई मिनट निष्क्रियता की तरह लगने के बाद मोंगोडीबी सर्वर द्वारा कनेक्शन बंद कर दिए जाते हैं, और वेब एप्लिकेशन द्वारा पुन: निर्मित करने की आवश्यकता होती है।

मुझे यह समझ में नहीं आ रहा है कि जब यह पुन: कनेक्ट होता है तो पाइमोंगो चालक एक त्रुटि को फेंक देता है (जिसे चालक के उपयोगकर्ता को स्वयं को संभालने की आवश्यकता होती है), इसे पारदर्शी रूप से करने के बजाय। (उपयोगकर्ता भी सेट कर सकता है कि एक विकल्प भी हो सकता है ताकि AutoReconnect अपवाद फेंक दिया जाए, लेकिन एक समझदार डिफ़ॉल्ट नहीं होगा कि इन अपवादों को बिल्कुल नहीं फेंक दिया जाए, और कनेक्शन निर्बाध रूप से फिर से बनाए गए हैं?)

मैंने कभी भी अन्य डेटाबेस सिस्टम का उपयोग करके इस व्यवहार का सामना नहीं किया है, यही कारण है कि मैं थोड़ा उलझन में हूं।

यह भी उल्लेखनीय है कि मेरे स्थानीय अनुप्रयोग मोंगोडीबी सर्वर से कनेक्ट होने पर मेरे वेब एप्लिकेशन के मोंगोडीबी कनेक्शन कभी विफल नहीं होते हैं (मुझे लगता है कि यह इस तथ्य से कुछ करने के लिए होगा कि यह एक स्थानीय कनेक्शन है, और यह कनेक्शन एक के माध्यम से किया जाता है नेटवर्क सॉकेट की बजाय यूनिक्स सॉकेट, लेकिन मैं गलत हो सकता था)।

+1

पायथन ड्राइवर डेवलपर्स ने जेआईआरए मुद्दों में कुछ बार Autoreconnect को संबोधित किया है। शुरुआत के लिए [पायथन -197] (https://jira.mongodb.org/browse/PYTHON-197) पर एक नज़र डालें। यदि आप ऑटोरेकनेक्ट के बारे में जेआईआरए में पहले से ही पढ़ चुके हैं और संतुष्ट नहीं हैं, तो मैं एक पायथन टिकट खोलूंगा। – wdberkeley

+0

इसे इंगित करने के लिए धन्यवाद!ऐसा लगता है जैसे मेरे जैसे गैर-पॉवर्यूसर, जो एक पूरी प्रतिकृति वाले मोंगो क्लस्टर को संचालित नहीं करते हैं, को छोड़ दिया गया है। क्या आपको कोई विचार है कि उन कनेक्शन वास्तव में क्यों बाहर निकलते हैं? सॉकेट बंद होने पर वे तुरंत विफल नहीं होना चाहिए? –

+1

मैं कुछ और नहीं कह सकता था कि कनेक्शन बहुत अधिक जानकारी के बिना क्यों विफल रहे हैं। कनेक्शन बंद होने के बारे में मोंगोड लॉग में कुछ भी है? – wdberkeley

उत्तर

6

आप ऑटोरेकनेक्ट को गलत समझ रहे हैं। यह तब उठाया जाता है जब ड्राइवर सर्वर के साथ संवाद करने का प्रयास करता है (एक आदेश या अन्य ऑपरेशन भेजने के लिए) और नेटवर्क विफलता या इसी तरह की समस्या होती है। अपवाद का नाम यह इंगित करने के लिए है कि आप को मोंगो क्लाइंट का एक नया उदाहरण बनाना नहीं है, जब आपका एप्लिकेशन अगले ऑपरेशन की कोशिश करता है तो मौजूदा क्लाइंट स्वचालित रूप से फिर से कनेक्ट करने का प्रयास करेगा। यदि एक ही समस्या होती है, तो ऑटो रीकनेक्ट फिर से उठाया जाता है।

मुझे संदेह है कि आप सॉकेट टाइमआउट (और ऑटोरकनेक्ट उठाए जा रहे हैं) को देख रहे हैं कि सर्वर और आपके एप्लिकेशन के बीच एक लोड बैलेंसर है जो निष्क्रियता की कुछ अवधि के बाद कनेक्शन बंद कर देता है। उदाहरण के लिए, यह सॉकेट पर 13 मिनट की गतिविधि के बाद माइक्रोसॉफ्ट के एज़ूर मंच पर स्पष्ट रूप से होता है। आप Pymongo 2.8 में जोड़े गए सॉकेटकिपएलिव विकल्प का उपयोग करके इसे ठीक करने में सक्षम हो सकते हैं। ध्यान दें कि आपको अपने एप्लिकेशन सर्वर पर रखरखाव अंतराल को उचित मान पर भी सेट करना होगा (लिनक्स पर डिफ़ॉल्ट 2 घंटे है)। See here for more information.

+0

यह ठीक था मुद्दा (यह Azure- विशिष्ट था)। हम अब एडब्ल्यूएस पर हैं और मैंने अब इस मुद्दे को नहीं देखा है। जानकारी के लिए धन्यवाद! –

संबंधित मुद्दे