2015-01-23 14 views
7

मान लें कि मेरे पास एक ही वर्ग से 100 धागे पढ़ रहे हैं - क्या यह गारंटी है कि प्रत्येक संदेश को एक बार में वितरित किया जा रहा है? क्या एक ही संदेश को एक से अधिक बार वितरित करना संभव है? मुझे इस मुद्दे पर कोई स्पष्ट दस्तावेज नहीं मिल रहा है। रोंएसक्यूएस केवल एक बार संदेश भेजकर

उत्तर

13

अद्यतन नवंबर 17, 2016:FIFO queueing with guaranteed-once delivery बस जारी किया गया था आज (लगभग 2 साल के बाद इस उत्तर मूल रूप से तैनात किया गया था) और SQS अब वास्तव में एक बार प्रसव समर्थन करता है। यहां विवरण हैं:

  • आपको FIFO Queue बनाने की आवश्यकता है।
  • कतार संदेश की विशेषता के रूप में MessageDeduplicationId के लिए डुप्लिकेशंस जांच करता है, और MessageDeduplicationId की जांच करके या तो कार्रवाई के बाद 5 मिनट के समर्पण अंतराल में भेजे गए और प्राप्त किए जाने से डुप्लिकेट संदेशों को रोकता है।
  • यदि सामग्री-आधारित deduplication FIFO कतार पर स्पष्ट रूप से सक्षम है, MessageDeduplicationId संदेश निकाय के SHA-256 हैश का उपयोग करके स्वचालित रूप से जेनरेट किया जाएगा (केवल सामग्री, गुण नहीं)।
  • यदि सामग्री-आधारित deduplication सक्षम नहीं है, तो आपको भेजने पर MessageDeduplicationId के लिए स्पष्ट रूप से अपना मनमाना मूल्य निर्धारित करना होगा। अन्यथा SendMessage एक त्रुटि के साथ विफल हो जाएगा।

creating a queue या updating the queue' attributes पर सामग्री-आधारित deduplication सक्षम किया जा सकता है।

0Dऔर ReceiveMessage दस्तावेज़ में MessageDeduplicationId पर अधिक जानकारी।


नवंबर 17, 2016 के बाद, यह अभी भी मानक (नहीं-फीफो) कतारों पर लागू होता है:

SQS में मानक (नहीं-फीफो) कतारों की वितरित प्रकृति के कारण, गारंटी है इसके बजाय "कम से कम" एक बार।

FAQ से:

प्रश्न: मैं प्रत्येक संदेश कितनी बार प्राप्त होगा?

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

अमेज़न SQS भंडार अतिरेक और उच्च उपलब्धता के लिए कई सर्वरों पर अपने संदेशों की प्रतियां: at least once वितरण पर

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

तुम सच में अपने आवेदन में प्रसंस्करण की गारंटी करने के "अधिकतम एक बार" की जरूरत है, तो आप अपने आवेदन unique identifiers of SQS messages और नहीं प्रक्रिया संदेश आईडी है कि आप पहले संसाधित, या जिनमें वर्तमान कार्रवाई कर रहे हैं जाँच करना चाहते हो सकता है।

+0

सबसे बड़ा सवाल यह है कि यदि यह बहुत ही कम समय में हो सकता है। मतलब, थ्रेड 1 और थ्रेड 2 प्रत्येक अनुरोध के दूसरे के भीतर एक ही संदेश प्राप्त कर सकते हैं। दस्तावेज में मुझे वह नहीं मिला। मैंने जवाब को किसी भी तरह से स्वीकार कर लिया, क्योंकि यह उस चीज़ के करीब आता है जो मैं ढूंढ रहा था। – Vladimir

+0

निश्चित रूप से, एक और सवाल है जिसने वास्तव में पूछा: http://stackoverflow.com/questions/28130677/time-period-between-duplicate- संदेश –

+0

मुझे कैसे पता चलेगा कि वर्तमान में कोई नौकरी संसाधित की जा रही है या नहीं? –

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