2014-04-24 9 views
21

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

समस्या उन डोमेन के साथ है जो अभी तक क्रॉल नहीं हुई हैं। उदाहरण के लिए यदि कतार में 1000 डोमेन हैं जो क्रॉल नहीं किए गए हैं। उनमें से कोई भी लिंक दोबारा जोड़ा जा सकता है, और बार-बार। जो मेरे एसक्यूएस को सैकड़ों हजारों संदेशों को swells जो ज्यादातर डुप्लिकेट है।

मैं इसे कैसे रोकूं? क्या कतार से सभी डुप्लीकेट हटाने का कोई तरीका है? या इससे पहले कि मैं इसे जोड़ने से पहले एक संदेश के लिए कतार खोजने का कोई तरीका है? मुझे लगता है कि यह एक समस्या है कि एसक्यूएस वाले किसी भी व्यक्ति को अनुभव होना चाहिए।

एक विकल्प जो मैं देख सकता हूं वह है यदि मैं एसक्यूएस में डोमेन को जोड़ने से पहले कुछ डेटा स्टोर करता हूं। लेकिन अगर मुझे डेटा दो बार स्टोर करना है, तो उस तरह से पहले एसक्यूएस का उपयोग करने का बिंदु खंडित हो जाता है।

+0

संभावित डुप्लिकेट [एसक्यूएस कतार में कई उपभोक्ताओं का उपयोग] [http://stackoverflow.com/questions/37472129/using-many-consumers-in-sqs-queue) – Krease

+1

एडब्ल्यूएस अब [फीफो कतार] प्रदान करता है (http: //docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html), जो "बिल्कुल एक बार प्रसंस्करण प्रदान करता है लेकिन प्रति सेकेंड 300 लेनदेन तक सीमित है"। – bishop

उत्तर

15

जैसा कि अन्य उत्तरों का उल्लेख है, आप एसक्यूएस से आने वाले डुप्लिकेट संदेशों को रोक नहीं सकते हैं।

अधिकांश बार आपके संदेश एक बार आपके उपभोक्ताओं को सौंपे जाएंगे, लेकिन कुछ चरण में डुप्लीकेट में चलाएगा।

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

यदि आपके वितरित आर्किटेक्चर के सभी कर्मचारी बेवकूफ़ थे, तो यह आसान होगा, क्योंकि आपको डुप्लिकेट के बारे में चिंता करने की आवश्यकता नहीं होगी। लेकिन हकीकत में, इस तरह का पर्यावरण मौजूद नहीं है, कहीं भी कुछ इसे संभालने में सक्षम नहीं होगा।

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

तथ्य दुकान

यह एक बहुत बढ़िया सुझाव सेवाएं विकसित करने के इतना है कि वे तथ्यों जो सैद्धांतिक रूप से सभी प्रभावित नीचे की ओर प्रणालियों में एक ही राज्य पुन: पेश करने पुनः बजाया जा सकता है इकट्ठा है।

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

अब चलो का कहना है कि में आते हैं व्यापार, और 3 प्रणालियों में रुचि देखते हैं करते हैं:

  1. एक पुरानी स्कूल मेनफ्रेम जो अद्यतन
  2. एक प्रणाली है कि सभी ट्रेडों और collates रहने की जरूरत है एक FTP सर्वर
  3. सेवा है कि व्यापार रिकॉर्ड करता है, और नए मालिक

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

अब आइए कल्पना करें कि हम एक तथ्य स्टोर बनाए रखते हैं, जो हमारे ब्रोकर में आने वाले सभी ट्रेडों की रिकॉर्डिंग है। और यह कि सभी 3 डाउनस्ट्रीम सेवा मालिक हमें यह बताने के लिए कहते हैं कि उन्होंने पिछले 3 दिनों से अपने सभी डेटा खो दिए हैं। एफ़टीपी डाउनलोड 3 दिन पीछे है, मेनफ्रेम 3 दिन पीछे है, और सभी ट्रेड 3 दिन पीछे हैं।

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

यह उदाहरण शीर्ष पर थोड़ा सा प्रतीत हो सकता है, लेकिन मैं कुछ विशेष रूप से व्यक्त करने की कोशिश कर रहा हूं: तथ्यों को ट्रैक रखने के लिए महत्वपूर्ण चीजें हैं, क्योंकि यही वह जगह है जहां हम डुप्लिकेट से लड़ने के लिए हमारे वास्तुकला में उपयोग करने जा रहे हैं ।

कैसे तथ्य दुकान हमें डुप्लिकेट संदेशों

आप एक हठ स्तरीय कि आप CAP theorem, स्थिरता और उपलब्धता की सीए भागों देता है पर अपने तथ्य दुकान को लागू परंतु साथ में मदद करता है, तो आपको निम्न कर सकते हैं:

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

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

मुबारक मामले - समय

तथ्य दुकान यह कह आपकी सेवा के लिए वापस आता है कि इस तथ्य मौजूद नहीं था, और कहा कि एक ताला बनाया गया था के अधिकांश, सेवा यह काम है करने के लिए प्रयास करता है तो क्या होगा । एक बार यह हो जाने के बाद, यह एसक्यूएस संदेश हटा देता है, और इस तथ्य को पूरा करता है।

डुप्लिकेट संदेश

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

आपदा मामले - शायद ही कभी होता

तो जब एक सेवा की दुकान में पहली बार के लिए इस तथ्य को रिकॉर्ड करता है कि क्या होता है, तो एक निश्चित अवधि के लिए एक ताला मिलता है, लेकिन अधिक गिर जाता है? खैर एसक्यूएस आपको एक संदेश फिर से पेश करेगा, अगर इसे उठाया गया था, लेकिन कतार से सेवा के बाद एक निश्चित अवधि के भीतर हटाया नहीं गया था। Thats हम अपने तथ्य स्टोर क्यों कोड करते हैं कि एक सेवा सीमित समय के लिए एक ताला रखती है। क्योंकि यदि यह खत्म हो जाता है, तो हम चाहते हैं कि एसक्यूएस सेवा को संदेश पेश करे, या बाद में एक और उदाहरण, उस सेवा को यह मानने की अनुमति दे कि तथ्य को फिर से राज्य (निष्पादित) में शामिल किया जाना चाहिए।

+0

अपना दृष्टिकोण साझा करने के लिए धन्यवाद –

+0

कोई समस्या नहीं है, यदि आप एक समान दृष्टिकोण अपनाते हैं, और समस्याओं में भाग लेते हैं, तो मुझे बताएं। मैं शायद मदद करने में सक्षम हो सकूं। – hendrikswan

+1

बहुत बढ़िया जवाब! थोड़ा नाइटपिक: मैं कहूंगा कि ** हैप्पी केस ** में आपको इस तथ्य को पूरा करना चाहिए, _ और फिर एसक्यूएस संदेश हटाएं। मैं तब भी संदेश को हटाने के लिए ** डुप्लिकेट संदेश ** केस अपडेट करने का सुझाव दूंगा यदि तथ्य पहले ही पूरा हो चुका है (मूल हैंडलर को ऐसा करने की प्रतीक्षा न करें)। –

2

एसक्यूएस कतार में डुप्लिकेट संदेशों को पोस्ट करने से रोकने का कोई एपीआई स्तर तरीका नहीं है। आपको आवेदन स्तर पर इसे संभालने की ज़रूरत होगी मुझे डर है।

आप अपने डोमेन नामों को क्रॉल करने के लिए प्रतीक्षा करने के लिए एक डायनेमोडीबी तालिका का उपयोग कर सकते हैं और उदाहरण के लिए यदि वे डायनेमो डीबी में नहीं हैं तो उन्हें केवल कतार में जोड़ें।

+2

लेकिन अगर मैं ऐसा करता हूं, तो एसक्यूएस का भी उपयोग क्यों करें? क्यों न केवल एप्लिकेशन को डायनेमो डीबी से सीधे पढ़ने दें? हो सकता है कि मैं एसक्यूएस के उपयोग को याद कर रहा हूं लेकिन अगर मुझे अभी भी डेटाबेस में सभी डेटा स्टोर करने की ज़रूरत है, तो मुझे लगता है कि एसक्यूएस अपना मूल्य और बिंदु खो देता है। मेरे लिए एक एसक्यूएस का उपयोग करने का कारण डेटाबेस को डेटा लिखने की आवश्यकता नहीं है। –

+1

यह एक वास्तुकला निर्णय है। एसक्यूएस (या कोई क्यूइंग सिस्टम) अनुप्रयोगों के बीच एसिंक्रोनस संचार की अनुमति देने और कई उत्पादकों से कई संदेश उपभोक्ताओं को संदेश लेने पर बहुत अच्छा है। उदाहरण एक वेब स्तर और बैच श्रमिकों के बेड़े के बीच होगा। डाटाबेस इस प्रकार के संचार पर डिजाइन नहीं किए गए हैं और अतिरिक्त काम की आवश्यकता होगी। लेकिन स्वतंत्र श्रमिकों या ऐप्स के बीच राज्य साझा करने में डीबी अच्छा है। आपके उपयोग के मामले में, शायद एक डीबी पर्याप्त होगा। –

2

चूंकि आप डुप्लिकेट संदेशों को भेजने से एसक्यूएस को रोक नहीं सकते हैं, तो आपको इसे अपने पक्ष में लागू करना होगा। ऐसा करने का एक आसान तरीका अपाचे कैमल के बेवकूफ उपभोक्ताओं का उपयोग कर रहा है, http://camel.apache.org/idempotent-consumer.html

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