2012-08-10 24 views
7

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

ऐसा करने का सबसे शानदार तरीका क्या है?

उत्तर

3

ऐसा करने के कम से कम दो तरीके हैं।

जब आप बोटो में कोई संदेश पढ़ते हैं, तो आपको एक संदेश ऑब्जेक्ट या कुछ सबक्लास प्राप्त होता है। संदेश ऑब्जेक्ट में "विशेषताएँ" फ़ील्ड है जो एक नियम है जिसमें एसक्यूएस द्वारा ज्ञात सभी संदेश विशेषताओं को शामिल किया गया है। एसक्यूएस ट्रैक की चीजों में से एक संदेश लगभग पढ़ने के अनुमानित # बार है। इसलिए, आप इस मान का उपयोग यह निर्धारित करने के लिए कर सकते हैं कि संदेश हटाया जाना चाहिए या नहीं, लेकिन आपको मूल्य की "अनुमानित" प्रकृति के साथ सहज रहना होगा।

वैकल्पिक रूप से, आप किसी भी प्रकार के डेटाबेस में संदेश आईडी रिकॉर्ड कर सकते हैं और प्रत्येक बार जब आप संदेश पढ़ते हैं तो डेटाबेस में गिनती फ़ील्ड बढ़ा सकते हैं। यह एक साधारण पायथन निर्देश में किया जा सकता है यदि संदेशों को हमेशा एक ही प्रक्रिया में पढ़ा जा रहा है या इसे सरल डीबी जैसे कुछ में किया जा सकता है यदि आपको प्रक्रियाओं में रीडिंग रिकॉर्ड करने की आवश्यकता है।

उम्मीद है कि मदद करता है।

>>> import boto.sqs 
>>> c = boto.sqs.connect_to_region() 
>>> q = c.lookup('myqueue') 
>>> messages = c.receive_message(q, num_messages=1, attributes='All') 
>>> messages[0].attributes 
{u'ApproximateFirstReceiveTimestamp': u'1365474374620', 
u'ApproximateReceiveCount': u'2', 
u'SenderId': u'419278470775', 
u'SentTimestamp': u'1365474360357'} 
>>> 
+0

धन्यवाद। मैंने बोटो दस्तावेज के माध्यम से स्किम किया है लेकिन किसी संदेश की गिनती प्राप्त करने के लिए कोई सुराग नहीं मिला। क्या तुम जानते हो यह कहां है? एक साधारण स्थानीय डेटाबेस होने के तरीके से इस मुद्दे को प्रबंधित करने का मेरा वैकल्पिक तरीका है, लेकिन पहले मैं इसे सरल रखना चाहूंगा-जैसे गिनती प्राप्त करना- यदि संभव हो .. – huzeyfe

+0

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

1

यह कुछ ही चरणों में किया जाना चाहिए:

यहाँ कुछ उदाहरण कोड है।

  1. SQS कनेक्शन बनाने: - sqsconnrec = SQSConnection (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)
  2. कतार वस्तु बनाने: - request_q = sqsconnrec.create_queue ("queue_Name")
  3. लोड कतार संदेशों: - संदेशों बस लेन (संदेश) कर
-: = request_q.get_messages()
  • अब आप संदेश की सरणी वस्तुओं और संदेशों की कुल संख्या को खोजने के लिए मिलता है

    आकर्षण की तरह काम करना चाहिए।

  • +0

    आपके ध्यान के लिए धन्यवाद लेकिन मुझे डर है कि यह मेरा मामला नहीं था। मुझे लेन (संदेश) की आवश्यकता नहीं है मुझे एक निश्चित संदेश की गिनती की आवश्यकता है। – huzeyfe

    +1

    हां, प्राप्त गणना प्राप्त करने के लिए बोटो में कोई परिभाषित कार्य नहीं है। मैं आपको एक स्थानीय ट्यूपल बनाए रखने का सुझाव दूंगा जिसमें संदेश आईडी, गिनती और संदेश निकाय की संख्या होगी। आप निश्चित समय के बाद कतार से संदेशों को लोड करते हैं, जांचें कि आईडी टुपल में मौजूद है या नहीं, यदि हां, तो गिनती गिनती बढ़ाएं, अगर प्राप्त गणना> 3, तो आप संदेश हटा सकते हैं। मैंने संदेश ऑब्जेक्ट के डीआईआर को देखा और इसमें कोई गिनती फ़ंक्शन नहीं है। उम्मीद है कि यह आपकी समस्या में मदद करता है। –

    +0

    यह वैकल्पिक समाधान था जो मुझे लगता है कि मेरे पास केवल यह विकल्प है। बहुत बहुत धन्यवाद .. – huzeyfe

    4

    अन्य तरीकों से आप अपने एसक्यूएस कतार में संदेश के अंत में एक अतिरिक्त पहचानकर्ता डाल सकते हैं। यह पहचानकर्ता संदेश पढ़ने के कितने समय की गिनती रख सकता है।

    यदि आप चाहते हैं कि आपकी सेवा बार-बार इन संदेशों को मतदान न करे, तो आप एक और कतार "डेड मैसेज कतार" कह सकते हैं और फिर उस संदेश को स्थानांतरित कर सकते हैं जिसने इस कतार में दहलीज पार कर ली है।

    1

    आपके द्वारा पढ़े गए संदेश से लगभग ReceiveCount विशेषता प्राप्त करें। इसे किसी अन्य कतार में ले जाएं (आप त्रुटि संदेशों को प्रबंधित कर सकते हैं) या बस इसे हटाएं।

    foreach (var message in response.Messages){ 
         try{ 
          var notifyMessage = JsonConvert.DeserializeObject<NotificationMessage>(message.Body); 
            Global.Sqs.DeleteMessageFromQ(message.ReceiptHandle); 
          } 
         catch (Exception ex){ 
          var receiveMessageCount = int.Parse(message.Attributes["ApproximateReceiveCount"]); 
          if (receiveMessageCount >3) 
           Global.Sqs.DeleteMessageFromQ(message.ReceiptHandle); 
          } 
         } 
    
    2

    एडब्ल्यूएस इस के लिए समर्थन में बनाया गया है, बस नीचे दिए चरणों का पालन करें:

    1. एक मृत पत्र कतार
    2. जाँच "उपयोग Redrive नीति" स्रोत कतार के लिए Redrive नीति को सक्षम बनाने के
    3. मृत पत्र कतार आप "डेड पत्र कतार"
    4. सेट के रूप में "3" "अधिकतम प्राप्त" या 1 और 1000 के
    5. के बीच किसी भी मूल्य के लिए # 1 चरण में बनाए गए चयन

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

    स्रोत आपके उत्तर के लिए Using Amazon SQS Dead Letter Queues

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