2014-10-29 11 views
5

गारंटी करने के लिए मैं (मेरे मामले में स्प्रिंग) के बहुत लगता है JMS का उपयोग कर आवेदन पत्र इस वर्कफ़्लो का पालन हो सकता है:कैसे JMS विश्वसनीय वितरण

Database A ===> Producer ===> JMS Queue ===> Consumer ===> Database B 

तो विश्वसनीयता चिंता का विषय है। आइए मान लें कि Database A में डेटा रिकॉर्ड हमेशा delivered के रूप में चिह्नित किया जाना चाहिए, जब संदेश में डेटा रिकॉर्ड सचमुच उपभोग होता है और Database B में डेटा को जारी रखता है। तो फिर वहाँ सवाल कर रहे हैं:

  1. मेरी जानकारी से, वर्तमान में JMS प्रोटोकॉल consumer से producer को पावती भेजने के लिए किसी भी कार्यों को परिभाषित नहीं करता, लेकिन केवल करने के लिए MOM है, इसलिए वास्तविक consumer-to-producer पावती तरीकों JMS प्रदाता के अनुसार अलग। तो क्या इसका मतलब यह है कि ऐसी स्वीकृति के लिए एक तंत्र विकसित करने का कोई तरीका नहीं है जो आम तौर पर सभी जेएमएस उत्पादों (एक्टिवएमक्यू, वेबस्पियर एमक्यू और जेबॉस एमक्यू) के लिए काम कर सकता है?

  2. ब्लैकआउट के परिदृश्य पर विचार करें, तो क्या यह कतार में संदेशों को केवल वाष्पित कर देता है ताकि पुनः भेजने की आवश्यकता हो? या विभिन्न जेएमएस उत्पादों को छोड़ दिया जा सकता है, क्योंकि संदेश सीरियलाइज्ड हैं, ताकि लापता संदेश केवल लेनदेन प्रबंधन या एसिंक/सिंक कॉन्फ़िगरेशन के कारण हो सकता है लेकिन एप्लिकेशन सर्वर की वजह से नहीं है?

उत्तर

3

जेएमएस प्रकृति द्वारा संदेश की डिलीवरी की गारंटी देता है, अगर संदेश पोस्ट किया गया है, तो यह किसी उपभोक्ता को दिया जाएगा, यदि कोई हो, तो एमओएम इस तथ्य को सुनिश्चित करने के लिए डिज़ाइन किया गया है। वैसे भी, वितरित आवश्यक प्रक्रिया का मतलब नहीं है।

  • पहले एक कतार में संदेश के हठ है (कतार और संदेश लगातार रूप में चिह्नित किया जाना चाहिए, जो डिफ़ॉल्ट मान है), जो कि संदेश को सुनिश्चित:

    विश्वसनीयता विभिन्न तंत्र द्वारा सुनिश्चित किया जाता है सिस्टम बाधा के मामले में खो नहीं जाएगा।

  • तो आपके पास पावती और पुनः प्रयास नीति है, जब तक उपभोक्ता इसे स्वीकार नहीं करता है और लेनदेन सत्र के मामले में संदेश को तब तक रखा जाएगा जब उपभोक्ता प्रभावी रूप से संदेश को संसाधित नहीं करता है या अधिकतम पुनः प्रयास नहीं किया जाता है। असफल संदेश को विश्लेषण के लिए मृत पत्र कतार में रीडायरेक्ट किया जा सकता है।

दो datasources आप कम से कम निर्माता तरफ XA लेन-देन का उपयोग करने के बीच जुटना सुनिश्चित करने के लिए आदेश की गारंटी करने के संदेश है कि में (आप कम से कम 2 संसाधन लेनदेन डेटाबेस ए और JMS कतार में निहित है) कतार में पोस्ट नहीं किया जाएगा यदि डेटाबेस ए में प्रतिबद्धता विफल हो जाती है या कतार में पोस्ट विफल होने पर डेटाबेस अद्यतन नहीं किया जाएगा। रोलबैक के मामले में पुनर्विक्रय सुनिश्चित करने के लिए संदेश खपत भी लेनदेन की जानी चाहिए।

लेनदेन की सीमाओं में उपभोक्ता और निर्माता दोनों शामिल नहीं होंगे क्योंकि यह संदेश प्रणाली की असीमित प्रकृति के साथ संघर्ष करता है, आप निर्माता पक्ष पर संसाधनों को लॉक करने का जोखिम नहीं उठा सकते हैं जब तक उपभोक्ता संदेश को संसाधित नहीं करता क्योंकि आपके पास कोई गारंटी नहीं है जब यह होगा।

एनबी: घटना है कि अपने डेटाबेस XA का समर्थन नहीं करता (या प्रदर्शन में सुधार करने के लिए) और आप केवल 2 लेन-देन (डेटाबेस और JMS कतार) में निहित संसाधन हैं, तो आप के लिए Logging Last Resource Transaction Optimization

2

1) कतार प्रबंधकों (MQ श्रृंखला, ActiveMQ और HornetQ) मैं निर्माता/उपभोक्ता के बीच पावती इस तरह की जरूरत कभी नहीं के साथ मेरा अनुभव से। साथ ही पर्यावरण जिसे मैं सौदा करता था, यातायात कई कतारों पर वस्तुओं के प्रति दिन 50/60 मिलियन था। और कतार सभी भी जारी हैं।

2) मेरे मामले में, कतार प्रबंधक पर दृढ़ता तंत्र का उपयोग करना ब्लैकआउट परिदृश्य को संभालने के लिए पूरी तरह से पर्याप्त था। मैंने एमक्यू सीरीज और हॉर्नेटक्यू पर डिस्क दृढ़ता का उपयोग किया।

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

यह कुछ है - मेरे दृष्टिकोण में - आपको अपने सिस्टम आर्किटेक्चर पर मापना होगा कि इस जानकारी से मेल खाना कितना महत्वपूर्ण है, क्योंकि यह रखना आसान नहीं है।

सम्मान।

+0

धन्यवाद देख सकते हैं में । तो मुझे लगता है कि 'ब्लैकआउट' सहिष्णुता अनुप्रयोग सर्वर (वेबस्पेयर, वेबलोगिक, जेबॉस ...) द्वारा प्रदान की जाती है, ActiveMQ के बारे में कैसे है ताकि एप्लिकेशन अपने आप से विश्वसनीय हो सके? – Dreamer

+1

मुझे लगता है कि आप दृढ़ता अनुभाग (http://activemq.apache.org/persistence.html) पर ActiveMQ दस्तावेज़ों पर जांच सकते हैं। संस्करण 4.1 के बाद से आप डिस्क या डेटाबेस का उपयोग कर दृढ़ता सुविधा सेट कर सकते हैं। मैंने इस कतार प्रबंधक पर कभी भी उपयोग नहीं किया, लेकिन मुझे पता है कि यह संभव है। :) – dansouza

+0

त्वरित प्रतिक्रिया के लिए धन्यवाद। मुझे अधिक राय आमंत्रित करने के लिए कुछ समय के लिए प्रश्न खोलना है, लेकिन आपका विचार कीमती है :) – Dreamer

1

यदि मैं आपका प्रश्न समझता हूं, तो यह जेटीए/एक्सए लेनदेन के मामले में लगता है (जब तक आपके डीबी/जेएमएस विक्रेता उन्हें समर्थन देते हैं)। स्प्रिंग TX प्रबंधक टीएक्स प्रबंधन (अधिक) विक्रेता अज्ञेयवादी बनाने में मदद कर सकते हैं।

एफवाईआई, मैं इस प्रकार के प्रवाह के लिए अपाचे कैमल का उपयोग करता हूं जिसमें उत्पादकों/उपभोक्ताओं के लिए बहुत अच्छी त्रुटि है।

+0

जेटीए का मतलब जावा लेनदेन एपीआई है, यह जावा में लेनदेन प्रबंधन पर सिर्फ एक जेएसआर है और आरडीबीएमएस/एमक्यू विक्रेता समर्थन प्रासंगिक नहीं है। मुझे लगता है कि आप एक्सए (एकाधिक संसाधन वितरित लेनदेन) कहना चाहते हैं ध्यान दें कि जेएमएस भी जावा और जेएसआर है और इसलिए सभी कार्यान्वयन xa अनुपालन (यदि नहीं, तो वे एक जेएमएस कार्यान्वयन नहीं कर रहे हैं लेकिन एक साधारण संदेश एक) – Gab

+0

इसके अलावा लेनदेन माँ की सीमाओं (निर्माता और उपभोक्ता) में कभी वितरित नहीं किया गया क्योंकि यह एमओएम की मैसेजिंग एसिंक्रोनस प्रकृति के साथ संघर्ष करता है। एक संदेश का निर्माण लेनदेन और उपभोग करने वाला भी हो सकता है लेकिन वे कभी भी उसी लेनदेन का हिस्सा नहीं होंगे। – Gab

+0

हां, जेटीए/एक्सए, धन्यवाद। मुझे लगता है कि हमारे पास माँ की अलग-अलग परिभाषाएं हैं। कुछ (सक्रिय एमक्यू की तरह) जेएमएस एपीआई को लागू करते हैं और एक्सए लेनदेन का समर्थन करते हैं, लेकिन कुछ (जैसे खरगोश) जेएमएस एपीआई को लागू नहीं करते हैं और वैश्विक लेनदेन का समर्थन नहीं करते हैं। बेशक डीबी (और डीबी ड्राइवर) के बहुत सारे एक्सए का समर्थन नहीं करते हैं। मेरा मुद्दा यह था कि एक वैश्विक लेनदेन निर्माता को यह जानने में सक्षम होना चाहिए कि उपभोक्ता सफल/सफल नहीं था (और स्प्रिंग टीएक्स प्रबंधक मदद कर सकता है)। – eze

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