2012-03-20 34 views
6

के साथ सर्विसस्टैक रेडिस क्लाइंट को कार्यान्वित करने के लिए हम एक पैटर्न को कार्यान्वित कर रहे हैं जहां हमारे ग्राहक यह देखने के लिए जांच करते हैं कि रेडिस में कोई दस्तावेज़ मौजूद है या नहीं, और यदि ऐसा नहीं होता है, तो हम डेटाबेस से डेटा प्राप्त करते हैं।टाइमआउट

हम ऐसे मामले को संभालने की कोशिश कर रहे हैं जहां रेडिस सर्वर डाउन या पहुंच योग्य नहीं है, इसलिए हम तुरंत डेटाबेस से प्राप्त कर सकते हैं।

हालांकि, जब हम जानबूझकर रेडिस सर्वर को ले कर हमारे कोड का परीक्षण करते हैं, तो सर्विसस्टैक क्लाइंट के माध्यम से रेडिस को कॉल लगभग 20 सेकंड के लिए टाइमआउट नहीं करता है।

हमने RedisClient.SendTimeout प्रॉपर्टी का उपयोग विभिन्न मानों (1000, 100, 1) पर करने का प्रयास किया, लेकिन टाइमआउट हमेशा लगभग 20 सेकंड के बाद होता है। हमने Ping() विधि का उपयोग करने का भी प्रयास किया लेकिन एक ही समस्या है।

प्रश्न: हम परिदृश्य को कैसे प्रबंधित कर सकते हैं जहां रेडिस सर्वर डाउन है और हम एक डीबी लाने के लिए और अधिक तेज़ी से स्विच करना चाहते हैं?

उत्तर

0

आपको रेडिस सर्वर पर भरोसा नहीं करना चाहिए कि आपको योजना बी पर फ़्लिप करने से पहले कितना समय इंतजार करना चाहिए। इस तर्क को अनुरोध पर कार्रवाई करने वाले कोड में रखें ताकि यह स्वतंत्र हो कि रेडिस सर्वर कैसे स्थापित किया गया है

1

मुझे ई-मेल भेजने में एक ही समस्या थी: कभी-कभी कोई जवाब नहीं होता है और बिल्ड-इन टाइमआउट (SmtpClient का) कुछ भी नहीं करता है। आखिर में मुझे एक टाइमआउट मिलेगा जो मुझे लगता है कि अंतर्निहित टीसीपी/आईपी परत से आता है। मैं क्लाइंट में टाइमआउट को टास्क पर "क्रूर टाइमआउट" से थोड़ा छोटा सेट करूंगा।

मेरे समाधान एक टास्क में कॉल लपेट, और उस पर एक समय समाप्ति का इस्तेमाल किया गया:

 // this special construct is to set a timeout (the SmtpClient timeout does not seem to work) 
     var task = Task.Factory.StartNew(() => SendEmail(request)); 

     if (!task.Wait(6000)) 
      Log.Error("Could not send mail to {0}. Timeout (probably on TCP layer).".Fmt(request.To)); 

हो सकता है कि इसी तरह की है, तो आप के लिए काम करेंगे सिर्फ एक विधि है कि Redis काम करता है के साथ SendEmail की जगह कुछ और।

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