2017-06-09 7 views
10

के साथ pymongo AutoReconnect अपवाद को कैसे संभालें I मेरे पास 3 सदस्यों और एक पायथन एप्लिकेशन के साथ एक मोंगो डीबी प्रतिकृति सेट है जो इसमें डेटा संग्रहीत करता है।insert_many विधि

def safe_mongo_call(method, num_retries, *args, **kwargs): 
    while True: 
     try: 
      return method(*args, **kwargs) 
     except (pymongo.errors.AutoReconnect, 
       pymongo.errors.ServerSelectionTimeoutError) as e: 
      if num_retries > 0: 
       logger.debug('Retrying MongoDB operation: %s', str(e)) 
       num_retries -= 1 
      else: 
       raise 

मुझे यकीन है कि नहीं कर रहा हूँ, हालांकि जब थोक का उपयोग कर लिखते हैं ये अपवाद कैसे संभाल करने के लिए, उदाहरण के लिए:

मैं जब एक आवरण के साथ एकल दस्तावेज़ आवेषण का उपयोग कर के रूप में इस pymongo के AutoReconnect अपवाद संभाल कर सकते हैं insert_many विधि। documentation के अनुसार, थोक लिखने परमाणु नहीं हैं, इसलिए यदि अपवादों में से कोई एक होता है, तो डेटाबेस में सफलतापूर्वक कुछ दस्तावेज़ पहले से ही लिखे जा सकते हैं। इस प्रकार, मैं ऊपर के रूप में रैपर विधि का पुन: उपयोग नहीं कर सकता।

इन स्थितियों को संभालने का सबसे अच्छा तरीका क्या है?

+0

प्रासंगिक: https : //gist.github.com/anthonywu/1696591 – TheChetan

+1

आपके द्वारा प्रदान किया गया कोड मूल रूप से वही चीज़ है जो मैंने प्रश्न में पोस्ट किया था। मेरा उपयोग मामला अलग है और इसमें थोक परिचालन शामिल हैं जिन्हें केवल पुनः प्रयास नहीं किया जा सकता है क्योंकि दस्तावेजों का हिस्सा पहले ही डेटाबेस में लिखा जा सकता है। –

उत्तर

3

इस मामले के लिए BulkWriteError कि क्या किया गया है https://api.mongodb.com/python/current/examples/bulk.html#ordered-bulk-write-operations

लेकिन कनेक्शन नुकसान के मामले में AutoReconnect बजाय भेज दिया जाता है और ऑपरेशन प्रगति पर जानकारी नष्ट हो गया लगता है पर विवरण प्रदान करना होगा (परीक्षण किया है pymongo == 3.5.1)

किसी भी मामले में आपको जो लिखा गया है उसे पुनर्निर्माण करने की आवश्यकता होगी और शेष वस्तुओं के लिए ऑपरेशन को पुनः प्रयास नहीं करना चाहिए। प्रत्येक दस्तावेज़ सम्मिलित करने के लिए असाइन किया गया है एक ObjectId जब तक: उत्तरार्द्ध मामले में यह के रूप में आप लेकिन क्या वास्तव में लिखा गया है पर पहले जानकारी अभी भी संभव

एक स्केच समाधान के रूप में की जरूरत नहीं है थोड़ा मुश्किल होगा _id पहले से मौजूद है। आप इसे स्वयं संभाल सकते हैं - दस्तावेजों पर पुनरावृत्त करें, _id मैन्युअल रूप से असाइन किए गए लोगों के लिए असाइन करें और आईडी को अस्थायी चर में सहेजें। एक बार जब आप अपवाद को मार देते हैं तो अंतिम _id सफलतापूर्वक लीवरेजिंग डाला गया है, यानी सबसे खराब ~ ओ (लॉगएन) प्रश्नों के लिए एक द्विआधारी खोज-जैसे दृष्टिकोण है, और शायद तथ्य का उपयोग भी कर सकते हैं थोक ऑपरेशन छोटे बैचों (https://api.mongodb.com/python/current/examples/bulk.html#bulk-insert) में विभाजित होते हैं। लेकिन निश्चित रूप से इस दृष्टिकोण की प्रयोज्यता आपके मोंगोड उदाहरणों पर लोड प्रोफ़ाइल तक है और क्या अतिरिक्त प्रश्न विस्फोट स्वीकार किए जाते हैं। यदि BulkWriteError अपेक्षित के रूप में फेंक दिया गया था, तो आप केवल उन दस्तावेज़ों को पकड़ सकते हैं जिन्हें सम्मिलित नहीं किया गया है और केवल इन दस्तावेज़ों के लिए ऑपरेशन को पुनः प्रयास किया गया है।

AutoReconnect समस्या पर वापस, मैं व्यक्तिगत रूप मोंगो-अजगर-चालक मुद्दों पर नजर में एक टिकट खोलने चाहते हैं, तो संभावना अधिक होती है इसके लिए या तो एक बग या उद्देश्य पर ऐसा किया जा रहा

+0

मैंने यह सब जांच लिया लेकिन यह समस्या है, अगर 'ऑटो रिककनेक्ट' फेंक दिया गया है, तो इसमें अब तक जो कुछ किया गया है, उसके बारे में जानकारी नहीं है। क्या आप विस्तारित कर सकते हैं कि * क्या लिखा गया है * पुनर्निर्माण कैसे करें? क्योंकि यह इतना आसान नहीं है, ध्यान में रखते हुए वहां से कई जगहें हो सकती हैं जहां से लिख सकते हैं और वस्तुओं में समान अर्थपूर्ण कुंजी हो सकती हैं (डुप्लीकेट नहीं)। –

+0

मेरा जवाब बढ़ाया – ffeast

+0

टिकट खोलना एक अच्छी दिशा हो सकती है, कम से कम यह पता लगाने के लिए कि तकनीकी कारण हैं कि ऐसा क्यों किया जाता है। –