2013-03-12 13 views
5

का कारण बनता है हम स्थितियों में, जहां उपयोगकर्ता कर संभाल करने कार्रवाई "की तरह बैच" एक वेब अनुप्रयोग के लिए NServiceBus चला रहे हैं। आग की तरह 1000 संस्थाओं को प्रभावित करता है एक कमांड ..गतिरोध जब NServicebus सेवा चल रही भ्रष्ट कनेक्शन

यह अच्छी तरह से काम करता है, लेकिन मध्यम लोड होने के दौरान हम कुछ गतिरोध मिलता है, यह एक समस्या नहीं है, बस संदेश पुन: प्रयास .. है ना? :)

समस्या तब होती है जब अगले संदेश आता है और एक कनेक्शन को खोलने के लिए कोशिश करता है। कनेक्शन तब "भ्रष्ट" है। System.Data.SqlClient.SqlException (0x80131904):

हम निम्नलिखित त्रुटि मिलती है नई अनुरोध शुरू करने के लिए क्योंकि यह मान्य लेनदेन वर्णनकर्ता के साथ आना चाहिए

मैं वेब खोज की है और मुझे लगता है कि अनुमति नहीं है हमारी समस्या एक सूचना NH "bug" है:

का संभावित हल कनेक्शन पूलिंग को अक्षम करने के होना चाहिए। लेकिन मैं उस तरह नहीं है, के बाद से performce नीचा होगा ..

हम NServiceBus 2.6, NHibernate 3.3 चला रहे हैं।

क्या किसी के पास इसका कोई अनुभव है? NServiceBus का अपग्रेड कर सकते हैं?

+0

यह बहुत एक मुद्दा हम मना रहे हैं के लिए इसी तरह लग रहा है। हमने इसे अभी तक हल नहीं किया है, और वर्तमान में पूलिंग के साथ-साथ लम्बाई कर रहे हैं। एमएसडीटीसी के संबंध में आपका सेटअप क्या है? –

+0

हम 2 वेब बक्से (हार्डवेयर लोड संतुलित, आईपी चिपचिपा) और एमएस डीटीसी सर्वर के साथ एक विफलता एसक्यूएल सर्वर क्लस्टर की है। –

+0

हमने अब कनेक्शन पूलिंग अक्षम कर दी है और समस्या अब और नहीं होती है। –

उत्तर

1

मैं अतीत में इस देखा है, यदि आपका डिजाइन वारंट, यदि आप अपने डेटाबेस कार्यों के लिए संदेश लेनदेन सभी तरह प्रवाह, किसी भी विफलताओं एक व्यापक प्रभाव पड़ेगा दो भागों में लेन-देन को तोड़ने की कोशिश, और यह प्रभाव होगा (आदर्श रूप में यह नहीं होना चाहिए) किसी भी बाद के संदेश भी।

+0

में थोड़ा और अधिक स्पष्टता जोड़ने के लिए, मैं क्या मतलब एक नेस्टेड लेन-देन का इस्तेमाल किया गया। डेटाबेस लेनदेन का समग्र संदेश लेनदेन पर कोई प्रभाव नहीं होना चाहिए। –

+0

हम सब कुछ एक छोटे से छोटे लेनदेन में तोड़ते हैं। लेकिन जब डेडलॉक अभी भी होता है, तो कनेक्शन पूलिंग चालू होने पर हमें त्रुटि मिलती है। –

0
इसके बजाय आदेश में 1000 संस्थाओं को अद्यतन करने का

आप एक घटना प्रकाशित करने का कहना है कि आदेश पूरा हो चुका है और फिर कई ग्राहकों को इस घटना पर अभिनय प्रभाव संस्थाओं को अद्यतन करने के लिए कर सकता है। यह मुझे लगता है कि एक आदेश जो 1000 इकाइयों को अद्यतन करता है उसे कई छोटे आदेशों में विभाजित किया जाना चाहिए। यह देखने के लिए एक सागर देखें कि आप लंबी चल रही व्यावसायिक प्रक्रिया को कैसे संभालेंगे। उदाहरण के लिए, आप, इस प्रक्रिया को शुरू कर दिया, चरण 1 पूरा, चरण 2 पूरा, प्रक्रिया आदि पूरा ... की तरह कुछ हो सकता है

+0

यही वह है जो हम करते हैं। जब उदा। उपयोगकर्ता एक कमांड जारी करता है जो 1000 इकाइयों को प्रभावित करता है जिसे हम कमांड को एक "इकाई" में विभाजित करते हैं। और यह एक गाथा द्वारा संभाला जाता है। –

+0

लेकिन जब लेनदेन में से कोई एक डेडलॉक हो जाता है, कनेक्शन कनेक्शन में वापस कनेक्शन भ्रष्ट होता है और जब सेवा संदेश को रीट्री करती है तो यह दूषित कनेक्शन हो जाती है, और हमें सभी नए संदेशों के लिए लेनदेन त्रुटि संदेश मिलता है .. –

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