मेरा पायथन वेब एप्लिकेशन में एक ही मोंगोडीबी सर्वर पर पंजीकृत कई कनेक्शन हैं, लेकिन 3 अलग-अलग डेटाबेस हैं। आवेदन 4 Gunicorn श्रमिकों के तहत चलाया जाता है।ब्लॉक जब तक नई प्रतिकृति सेट कॉन्फ़िगरेशन
मैं एक प्रतिकृति सेट का उपयोग कर रहा हूं।
प्राथमिक होने पर, वर्तमान क्वेरी विफल हो जाती है और मोंगोरेप्लिकासेट क्लाइंट (2.8 में रीफ्रेश निर्धारित होता है, लेकिन मुझे लगता है कि 3.2 में यह वही है)। अगली क्वेरी तब सफल हो सकती है जब उस समय कोई नया प्राथमिकता चुना जाता है और मॉनिटर थ्रेड को क्लाइंट के कनेक्शन को अद्यतन करने के बारे में जानकारी मिलती है।
लेकिन रीफ्रेश केवल इस क्लाइंट को प्रभावित करता है। अन्य मोंगोडीबी सर्वर से जुड़े अन्य क्लाइंट प्रभावित नहीं होते हैं - एक ही कहानी प्रत्येक के साथ होती है। इसका अर्थ यह है कि यदि प्रत्येक कर्मचारी एक ही मोंगोडीबी सर्वर पर 3 डेटाबेस से जुड़ा हुआ है और मैं वही HTTP अनुरोध दोहरा रहा हूं जो प्राथमिकता में विफल होने पर सभी 3 डेटाबेस का उपयोग करता है, तो सभी कनेक्टेड क्लाइंट को अपडेट करने में अनिश्चित समय लगता है। यदि प्रत्येक HTTP अनुरोध 4 में से प्रत्येक कार्यकर्ता को राउंड-रॉबिन जाता है तो हमें प्रत्येक मोंगो क्लाइंट को अपडेट करने के लिए 12 अनुरोधों की आवश्यकता होती है। लेकिन हकीकत में अनुरोध राउंड-रॉबिन नहीं जाते हैं।
PyMongo कोड MongoReplicaSetClient._send_message_with_response
मैं देख रहा हूँ जब प्राथमिक नीचे है, self.disconnect
कहा जाता है कि जो self.__schedule_refresh
कॉल में देख रहे हैं। इस विधि में sync
तर्क है, जो "रीफ्रेश पूर्ण होने तक अवरुद्ध" करने की अनुमति देता है।
मेरा विचार AutoReconnect
अपवाद को पकड़ना है और असफल प्राथमिक से जुड़े हुए सभी क्लाइंट्स पर __schedule_refresh(sync=True)
को कॉल करना है जब तक कि नई प्रतिकृति सेट कॉन्फ़िगरेशन न हो। इसलिए डेटाबेस अनुरोध ठीक होने तक HTTP अनुरोधों को संसाधित नहीं किया जाएगा (परिणामस्वरूप 500)।
लेकिन __schedule_refresh
एक निजी विधि है। इसके अलावा मुझे नहीं पता कि यह सभी ग्राहकों पर अनुक्रमिक रूप से कॉल करना तेजी से होगा - MonitorThread
दिखता है अंतराल में इसका काम करता है।
या शायद मैं MongoReplicaSetClient.refresh
का उपयोग कर सकता हूं।
विचार के बारे में आप क्या सोचते हैं? क्या इसमें कमी है?
क्या आप कार्यान्वयन के साथ मेरी मदद करेंगे?