2012-06-12 11 views
6

में Booksleeve Redis क्लाइंट का उपयोग करते समय Redis कनेक्शन त्रुटियां मैंने हाल ही में नए Azure VMs पर मेरा एक साइड प्रोजेक्ट होस्ट करना शुरू कर दिया है। ऐप रेडिस को इन-मेमोरी कैश के रूप में उपयोग करता है। सबकुछ मेरे स्थानीय माहौल में ठीक काम कर रहा था, लेकिन अब जब मैं कोड को Azure में ले गया हूं तो मुझे बुक्सलीव से बाहर आने वाले कुछ अजीब अपवाद देख रहे हैं।Azure VM

जब ऐप पहली बार आग लग जाता है तो सब ठीक काम करता है। हालांकि, लगभग 5-10 मिनट निष्क्रियता के बाद ऐप के अगले अनुरोध को नेटवर्क अपवाद का अनुभव होता है (मैं अभी काम पर हूं और मेरे पास सही त्रुटि संदेश नहीं हैं, इसलिए जब मैं घर लौटाता हूं तो मैं उन्हें पोस्ट करूंगा लोग सोचते हैं कि वे चर्चा के लिए जर्मनी हैं) इससे आंतरिक संदेश क्यूई बंद हो जाता है, जिसके परिणामस्वरूप प्रत्येक अनुवर्ती एंक्यू() एक अपवाद फेंकता है ("कतार बंद है")।

तो कुछ googling के बाद मुझे यह SO पोस्ट मिला: Maintaining an open Redis connection using BookSleeve एक DIY कनेक्शन प्रबंधक के बारे में। अगर मैं कार्रवाई का सबसे अच्छा तरीका हूं तो मैं निश्चित रूप से कुछ इसी तरह कार्यान्वित कर सकता हूं।

तो, सवाल:

  1. यह सामान्य RedisConnection समय की एक निश्चित राशि के बाद समय-समय पर बंद करने के लिए के लिए है?
  2. मैंने conn.SetKeepAlive() विधि देखी है लेकिन मैंने कई अलग-अलग मानों की कोशिश की है और कोई भी कोई फर्क नहीं पड़ता है। क्या इसके लिए और क्या मैं गलत पेड़ को भड़क रहा हूं?
  3. क्या इस परिदृश्य को संभालने के लिए सबसे ऊपर दिए गए पोस्ट से कनेक्शन प्रबंधक विचार है?
  4. क्या कोई भी इस बात का कोई कारण नहीं उठा सकता कि मेरे रेडिस इंस्टेंस को नए एज़ूर वीएम में क्यों होस्ट करना इस मुद्दे का कारण बनता है? मैं यह भी पुष्टि कर सकता हूं कि अगर मैं Azure Redis VM के खिलाफ अपना स्थानीय वातावरण चलाता हूं तो मुझे इस समस्या का अनुभव होता है।

जैसा कि मैंने कहा, अगर निष्क्रियता के बाद रेडिस कनेक्शन मरने के लिए असामान्य है, तो मैं घर आने पर अपने लॉग से स्टैक निशान और अपवाद पोस्ट करूंगा।

धन्यवाद!

अद्यतन डिडिएर टिप्पणी है कि इस भार balanacer कि Azure का उपयोग करता है से संबंधित हो सकता में बताया: http://blogs.msdn.com/b/avkashchauhan/archive/2011/11/12/windows-azure-load-balancer-timeout-details.aspx

मान लिया जाये कि ऐसी बात है, क्या एक कनेक्शन प्रबंधक है कि सकता है लागू करने के लिए सबसे अच्छा तरीका है इस मूर्ख समस्या के लिए खाते हैं। मुझे लगता है कि मुझे सही काम की प्रति इकाई कनेक्शन नहीं बनाना चाहिए?

+0

रेडिस कॉन्फ़िगरेशन फ़ाइल के टाइमआउट पैरामीटर में आपके पास क्या है? यह निष्क्रिय टाइमआउट है (रेडिस क्लोजिंग निष्क्रिय कनेक्शन से बचने के लिए इसे 0 पर सेट करें)। –

+0

टाइमआउट पहले से ही 0 पर सेट है। बस इसे दो बार भी चेक किया। :( – Eric

+1

यह AzureVM का "फीचर" प्रतीत होता है ... http://blogs.msdn.com/b/avkashchauhan/archive/2011/11/12/windows-azure-load-balancer-timeout- विवरण देखें .aspx –

उत्तर

6

अन्य उत्तरों/टिप्पणियों से, ऐसा लगता है कि यह अजीब दिखने वाले सॉकेट को बंद करने वाले एज़ुर इंफ्रास्ट्रक्चर के कारण होता है। आप में बस एक टाइमर हो सकता है जो समय-समय पर किसी प्रकार का ऑपरेशन करता है, लेकिन ध्यान दें कि यह पहले से ही बुकस्लीव में बनाया गया है: जब यह कनेक्ट होता है, तो यह जांचता है कि रेडिस कनेक्शन टाइमआउट क्या है, और रेडिस को बंद करने से रोकने के लिए दिल की धड़कन को कॉन्फ़िगर करता है सॉकेट। आप सॉकेट को बंद करने से रोकने के लिए इसे पिग-बैक करने में भी सक्षम हो सकते हैं।उदाहरण के लिए, एक redis-CLI सत्र में:

config set timeout 30 

30 सेकंड कनेक्शन समयबाह्य है करने के लिए (पुनः आरंभ करने के बिना मक्खी पर,) redis कॉन्फ़िगर करना चाहिए। बुकलीव को स्वचालित रूप से यह सुनिश्चित करने के लिए कदम उठाने चाहिए कि 30 सेकंड से पहले दिल की धड़कन हो। ध्यान दें कि यदि यह सफल है, तो आपको अपनी कॉन्फ़िगरेशन फ़ाइल भी संपादित करनी चाहिए ताकि यह सेटिंग अगले पुनरारंभ के बाद भी लागू हो।

+0

यह इंगित करने योग्य है कि आपको वास्तव में टाइमआउट सेट करने की आवश्यकता है> 0 पुस्तकें के लिए स्वचालित पिंग() चेक करने के लिए conn.SetKeepAlive (true) सेट है। तो Azure पर, आपको टाइमआउट को उपरोक्त 30 सेकंड तक सेट करने की आवश्यकता है और साथ ही साथ। SetKeepAlive (true)। कॉन्फ़िगरेशन टाइमआउट सेट के बिना, बुकस्लीव पिंग चेक नहीं करेगा (यहां तक ​​कि keepalive = true के साथ भी, कोई टाइमआउट सेट नहीं होने पर बुकस्लीव स्किप पिंग्स के अंदर एक आंतरिक जांच)। इसका मतलब यह होगा कि अजेय अभी भी निष्क्रियता के कारण सॉकेट को बंद कर देता है। – Andrew

+0

क्या StackExchange.Redis को रेडिस कॉन्फ़िगरेशन में टाइमआउट मौजूद होने पर यह दिल धड़कने का व्यवहार होता है? – slypete

+1

@ स्लीपेट हां, लेकिन अगर कोई टाइमआउट मौजूद नहीं है तो इसमें एक डिफ़ॉल्ट दिल की धड़कन भी है –

1

विंडोज़ एज़ूर में लोड बैलेंसर लोड बैलेंसर पर कुल कनेक्शन लोड पर निर्भर होने के बाद कनेक्शन बंद कर देगा और इसके कारण आपको अपने कनेक्शन में यादृच्छिक टाइमआउट मिलेगा।

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

+0

धन्यवाद अवकाश। मैं वास्तव में नए एज़ूर पूर्वावलोकन में वर्चुअल नेटवर्क का उपयोग करने की कोशिश करने जा रहा था, लेकिन दुर्भाग्य से मुझे कस्टम छवि से वीएम बनाने की अनुमति नहीं है और इसे एफ़िनिटी समूह में जोड़ दिया गया है। जाहिर है कि केवल त्वरित बनाएँ स्क्रीन से ही अनुमति है? मैंने वर्चुअल नेटवर्क फोरम में एक फोरम पोस्ट भी सबमिट किया है। – Eric

+0

हाय एरिक, मैंने आपकी पोस्ट देखी, और वीएम निर्माण मुद्दे पर आपकी मदद करने में सक्षम हो जाएगा हालांकि एमएसडीएन फोरम के साथ कुछ समस्या है इसलिए मैं आपसे संपर्क नहीं कर सकता। एक बार यह हल हो जाने पर मैं यह देखने के लिए संपर्क करूँगा कि क्या किया जा सकता है .. धन्यवाद .. – AvkashChauhan

+0

मुझे विश्वास है कि मुझे पता है कि क्या हो रहा है। जाहिर है कि मैंने जो छवि बनाई है वह केवल उस स्थान पर उपलब्ध है जहां उसने जीवन शुरू किया (जो यूएस पश्चिम था) - मैंने छवि के बाद vlan बनाया, और अब ऐसा लगता है कि छवि को एक स्थान से दूसरे स्थान पर ले जाना संभव नहीं है। क्या आपको कोई विचार है कि एक वैलान बनाने के प्रदर्शन प्रदर्शन दृष्टिकोण से काफी बेहतर होगा? मेरा मतलब है, अगर आवश्यकता हो तो मेरे ऐप में सिर्फ दिल की धड़कन पैदा करना बहुत कठिन नहीं है। – Eric