2016-01-06 8 views
5

मेरा पायथन वेब एप्लिकेशन में एक ही मोंगोडीबी सर्वर पर पंजीकृत कई कनेक्शन हैं, लेकिन 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 का उपयोग कर सकता हूं।

विचार के बारे में आप क्या सोचते हैं? क्या इसमें कमी है?

क्या आप कार्यान्वयन के साथ मेरी मदद करेंगे?

उत्तर

0

दिलचस्प समस्या।

अगर आप ऐसा माहौल अनुरोध के बहुत सारे में आ रहे हैं में चला रहे हैं, मैं के खिलाफ सुझाव है किसी भी कार्यकर्ता आईओ पर ब्लॉक, एक प्राथमिक आने के लिए के लिए इंतज़ार कर की तरह विशेष रूप से एक नेटवर्क कॉल होने हैं।

मैं आपके मोंगो क्लाइंट से अपवादों को पकड़ने का प्रयास करने का सुझाव दूंगा जो संकेत दे सकता है कि सर्वर नीचे है और कॉलर को 503s वापस कर देता है। 503 आमतौर पर संवाद करने का एक अच्छा तरीका है कि संसाधन अनुपलब्ध है और बाद में पुनः प्रयास करने का सुझाव देता है।

अपने मोंगो डेटाबेस उपयोग के दौरान नीचे जाना और appserver इस का पता लगाने के लिए होने, अनुरोध डंप और 503s वापस आ जाएगी एक तरह से यातायात कि अन्यथा, अवरुद्ध शुरू धागे से बाहर चलाने और appserver मार डालेंगे को संभालने के लिए है। ऐपसेवर ने इन सभी कॉलों को शेड किया है जिसके परिणामस्वरूप प्रतीक्षा और संभावित विफलता होगी।

यह एक आम बाकी सेवाओं में प्रयोग मुहावरा है: http://www.restpatterns.org/HTTP_Status_Codes/503_-_Service_Unavailable

आप भी जोड़ सकते हैं एक 'पुनः प्रयास-बाद' शीर्षक से संकेत मिलता है जब ग्राहक भविष्य में पुनः प्रयास का प्रयास करना चाहिए। पुन: प्रयास करें-के बाद शीर्ष पर कुछ अधिक जानकारी तथा कुछ ब्राउज़रों व्याख्या:

Retry-after HTTP response header - does it affect anything?

HTH

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