2011-06-21 10 views
50

मेरे जेएमएस अनुप्रयोगों पर हम उत्पादकों पर अस्थायी कतार का उपयोग उपभोक्ता अनुप्रयोगों से जवाब प्राप्त करने में सक्षम होने के लिए करते हैं।ActiveMQ: अस्थायी कतारों का उपयोग करते समय ब्रोकर विफलता को कैसे संभालें

मैं अपने अंत पर ठीक उसी मुद्दे का सामना करना पड़ रहा के रूप में इस थ्रेड में उल्लिखित: http://activemq.2283324.n4.nabble.com/jira-Created-AMQ-3336-Temporary-Destination-errors-on-H-A-failover-in-broker-network-with-Failover-tt-td3551034.html#a3612738

जब भी मैं अपने नेटवर्क में एक मनमाना दलाल को पुनः आरंभ, मैं अपने उपभोक्ता आवेदन लॉग में इस तरह के कई त्रुटियाँ हो रही थी भेजने की कोशिश एक अस्थायी कतार का उत्तर दें:

javax.jms.InvalidDestinationException: 
    Cannot publish to a deleted Destination: temp-queue://ID:... 

तब मैंने देखा कि गैरी वहाँ प्रतिक्रिया

jms.watchTopicAdvisories=false 
औ रूप

उपयोग करने के लिए सुझाव क्लाइंट brokerURL पर आरएल परम। मैंने तुरंत अपने क्लाइंट ब्रोकर यूआरएल को इस अतिरिक्त पैरामीटर के साथ बदल दिया। लेकिन अब मैं इस तरह त्रुटियों देख रहा हूँ जब मैं इस विफलता के परीक्षण के लिए नेटवर्क में मेरी दलालों को पुनः आरंभ:

javax.jms.JMSException: 
    The destination temp-queue: 
    //ID:client.host-65070-1308610734958-2:1:1 does not exist. 

मैं ActiveMQ 5.5 संस्करण का उपयोग कर रहा हूँ। इसके अतिरिक्त यहां

failover:(tcp://amq-host1:61616,tcp://amq-host2.tred.aol.com:61616,tcp://amq-host3:61616,tcp://amq-host4:61616)?jms.useAsyncSend=true&timeout=5000&jms.watchTopicAdvisories=false 

4 दलालों में से एक के लिए मेरी ActiveMQ config एक्सएमएल है:: और मेरे मुवक्किल दलाल URL ऐसा दिखाई देगा amq1.xml

किसी को यहाँ इस समस्या पर गौर और कृपया मुझे सुझाव है कि क्या गलती मैं मैं इस सेटअप में कर रहा हूँ।

अद्यतन:

कैसे मैं अपने कोड में अनुरोध-प्रतिक्रिया कर रहा हूँ पर आगे स्पष्ट करने के लिए:

  1. मैं पहले से ही एक प्रति निर्माता गंतव्य (यानी अस्थायी कतार) का उपयोग करते हैं और इस में सेट इसे जवाब दें प्रत्येक संदेश का शीर्षलेख।
  2. मैं पहले ही एक संदेश भेज रहा हूं जो JMSCorrelationID शीर्षलेख में अद्वितीय सहसंबंध पहचानकर्ता है।
  3. जहां तक ​​मुझे पता है कि ऊंट और वसंत भी अनुरोध-प्रतिक्रिया तंत्र के लिए अस्थायी कतार का उपयोग कर रहे हैं। केवल अंतर यह है कि वसंत जेएमएस कार्यान्वयन प्रत्येक संदेश के लिए अस्थायी कतार बनाता है और नष्ट करता है जबकि मैं निर्माता के जीवनकाल के लिए अस्थायी कतार बना देता हूं। क्लाइंट (निर्माता) ऐप शट डाउन या एएमक्यू ब्रोकर द्वारा यह अस्थायी कतार नष्ट हो जाती है जब यह महसूस होता है कि इस अस्थायी कतार से कोई सक्रिय निर्माता संलग्न नहीं है।
  4. मैं पहले से ही निर्माता पक्ष पर प्रत्येक संदेश पर एक संदेश समाप्ति सेट कर रहा हूं ताकि संदेश बहुत लंबी (60 सेकंड) के लिए कतार में नहीं रखा जा सके।
+1

क्या नया 'जेएमएसएक्सप्शन' अभी आपके क्लाइंट कोड में लॉग या फेंक दिया गया है? साथ ही, क्लाइंट ब्रोकर को भेजे गए प्रत्येक संदेश पर अपवाद फेंक दिया गया है, या विफलता पूर्ण होने पर अपवाद रोकता है? (क्या अपवाद केवल उस समय के दौरान फेंक दिया गया है जब ग्राहक कनेक्ट नहीं होता है?) – Bringer128

+2

वहां [ऐसा लगता है] (http://activemq.apache.org/advisory-message.html#AdvisoryMessage-Disablingadvisorymessages) कुछ चीजें आपको अपने XML कॉन्फ़िगरेशन में 'jms.watchTopicAdvisories = false', यानी' <ब्रोकर सलाहकार समर्थन = "झूठी"> 'और आपके नेटवर्क को स्थिर रूप से कॉन्फ़िगर करने के अतिरिक्त करने की आवश्यकता है। (आपकी amq1.xml फ़ाइल मुझे 404 नहीं मिली) – opyate

+1

@ Bringer128: आपकी टिप्पणी के लिए धन्यवाद। वह जेएमएस अपवाद अन्य एएमक्यू ब्रोकर पर फेंक दिया गया है जहां निर्माता फिर से कनेक्ट होने के बाद जुड़ता है। और एक बार ऐसा होने पर जेएमएस निर्माता उपभोक्ता से किसी भी प्रतिक्रिया प्राप्त करना बंद कर देता है क्योंकि एएमक्यू ब्रोकर सिर्फ उपरोक्त जेएमएस अपवाद के साथ निर्माता को जवाब नहीं भेज सकता है। – anubhava

उत्तर

24

ब्रोकर विशेषता है, org.apache.activemq.broker.BrokerService # cacheTempDestinations जो विफलता में मदद करनी चाहिए: केस। एक्सएमएल कॉन्फ़िगरेशन में सत्य पर सेट करें, और एक क्लाइंट डिस्कनेक्ट होने पर तत्काल गंतव्य हटाया नहीं जाएगा। एक तेज़ विफलता: पुनः कनेक्ट करने के लिए फिर से कनेक्ट करने और/या उपभोक्ता कतार से उपभोग करने में सक्षम हो जाएगा।

समय पर आधारित टाइमर कार्य होता है BeforePurgeTempDestinations (डिफ़ॉल्ट 5 सेकंड) जो कैश हटाने को संभालता है।

हालांकि एक चेतावनी, मुझे सक्रियमक-कोर में कोई परीक्षण नहीं दिख रहा है जो उस विशेषता का उपयोग करता है, इसलिए मैं आपको इस पर कोई गारंटी नहीं दे सकता।

+1

यदि आपने देखा है कि मैंने अपने प्रश्न में लिखा है: 'जब भी मैंने अपने नेटवर्क में मनमानी ब्रोकर को फिर से शुरू किया'। तो मैं सोच रहा हूं कि क्या दलाल को फिर से शुरू किया जा रहा है, क्या इस ब्रोकर विशेषता 'कैश टेम्पम्डिनेशन' का कोई असर होगा? – anubhava

+4

जब आप ब्रोकर को पुनरारंभ करते हैं, तो किसी भी लंबित संदेश के साथ किसी भी लंबित गंतव्य खो जाएंगे। अस्थायी स्थलों के लिए दलाल द्वारा बनाए रखा कोई निरंतर राज्य नहीं है। – gtully

+0

सबसे अच्छा हम कर सकते हैं: 1) समर्थन विफलता: मौजूदा ब्रोकर से पुनः कनेक्ट करें। 2) एक अस्थायी गंतव्य के जवाब से पहले दलालों या ब्रोकर विफलता के बीच नेटवर्क विभाजन के मामले में, अस्थायी गंतव्य को स्वतः बनाया जा सकता है। – gtully

9

ब्रोकर पर अस्थायी कतार बनाए जाते हैं, जिसमें आपके अनुरोध-उत्तर परिदृश्य में अनुरोधकर्ता (निर्माता) कनेक्ट होता है। वे javax.jms.Session से बनाए जाते हैं, इसलिए क्लाइंट डिस्कनेक्ट या ब्रोकर विफलता/विफलता के कारण, उस सत्र को डिस्कनेक्ट करने पर, उन पंक्तियों को स्थायी रूप से समाप्त कर दिया जाता है। अन्य ब्रोकरों में से कोई भी समझ नहीं पाएगा कि इसका मतलब क्या है जब आपके उपभोक्ताओं में से एक उन कतारों का जवाब देने का प्रयास करता है; इसलिए आपका अपवाद।

यह मानसिकता में एक वास्तुशिल्प बदलाव की आवश्यकता है मानते हुए कि आप फेलओवर से निपटना चाहते हैं और अपने सभी संदेशों को जारी रखना चाहते हैं।यहां एक सामान्य तरीका है कि आप समस्या पर हमला कर सकते हैं:

  1. आपके उत्तर-शीर्षलेखकों को अनुरोधकर्ता प्रक्रिया के लिए विशिष्ट कतार का संदर्भ देना चाहिए: उदा। queue:response.<client id>। यदि आपके पास बड़ी संख्या में क्लाइंट हैं, या यूयूआईडी है तो क्लाइंट आईडी मानक नाम हो सकती है यदि आपके पास बड़ी संख्या में है।
  2. आउटबाउंड संदेश को एक सहसंबंध पहचानकर्ता सेट करना चाहिए (केवल एक स्टिंग जो आपको एक प्रतिक्रिया के साथ अनुरोध को जोड़ने देता है - अनुरोधकर्ता सभी एक ही समय में एक से अधिक अनुरोध कर सकते हैं)। यह JMSCorrelationID शीर्षलेख में सेट है, और अनुरोध से प्रतिक्रिया संदेश में कॉपी किया जाना चाहिए।
  3. अनुरोधकर्ता को उस कतार पर एक श्रोता स्थापित करने की आवश्यकता है जो संदेश निकाय को उस correllation आईडी के आधार पर अनुरोध थ्रेड पर वापस कर देगा। कुछ मल्टीथ्रेडिंग कोड हैं जिन्हें इसके लिए लिखा जाना चाहिए, क्योंकि आपको धागे की उत्पत्ति (संभवतः वायदा के माध्यम से) के लिए सहसंबंध आईडी के मानचित्र की तरह कुछ प्रबंधित करने की आवश्यकता होगी।

Apache Camelrequest-response over messaging के लिए यह एक समान दृष्टिकोण है।

ध्यान देने योग्य एक बात यह है कि क्लाइंट करता है जब कतार दूर नहीं जाएगी, इसलिए आपको प्रतिक्रिया संदेश पर रहने के लिए समय निर्धारित करना चाहिए ताकि ब्रोकर से इसे हटाया जा सके, अगर इसे उपभोग नहीं किया गया है, अन्यथा आपको बिना किसी संदेश के बैकलॉग मिलेगा। आपको dead letter queue strategy to automatically discard expired messages सेट अप करने की भी आवश्यकता होगी।

+0

धन्यवाद आपका विस्तृत उत्तर मैंने आपके सभी बिंदुओं का जवाब देने के लिए अपने प्रश्न में एक अपडेट अनुभाग जोड़ा है। क्या आप किसी भी मौके से मुझे ** प्रति उत्पादक अस्थायी कतार ** का उपयोग न करने का सुझाव देते हैं? – anubhava

+0

यह सही है, अस्थायी कतार विफलता के लिए डिज़ाइन नहीं की गई हैं - वे सत्र के माध्यम से ग्राहक और ब्रोकर के बीच अनुबंध हैं; सत्र एक व्यक्तिगत कनेक्शन पर बैठता है। ऊंट डिफ़ॉल्ट रूप से अस्थायी कतारों के माध्यम से अनुरोध करता है, लेकिन यह उल्लिखित कारणों के लिए अक्सर अव्यवहारिक होता है, और इस तरह की सेवा की गुणवत्ता को पूरा करने के लिए स्थिर कतारों को फॉलबैक के रूप में समर्थन करता है (हालांकि यह सहसंबंध के लिए कतारों पर जेएमएस चयनकर्ताओं का उपयोग करता है, जो कि चाहिए प्रदर्शन कारणों से बचा जाना चाहिए)। –

+0

आईएमओ यह मानना ​​गलत है कि 'अस्थायी कतार विफलता के लिए डिज़ाइन नहीं की गई हैं'। इसके अलावा यदि एक अस्थायी कतार का उपयोग नहीं किया जाता है तो आपके पास प्रदाता प्रक्रिया के लिए विशिष्ट कतार कैसे हो सकती है या प्रति निर्माता अन्य शब्दों में जब आप सभी उत्पादकों को पहले से नहीं जानते हैं। – anubhava

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