2012-06-21 16 views
8

के साथ प्रोसेसिंग एसक्यूएस कतार में मेरे पास ec2 इंस्टेंस पर बोटो लाइब्रेरी का उपयोग करके एक पायथन स्क्रिप्ट है जो एक ऑटोस्कलिंग समूह का हिस्सा है। स्क्रिप्ट एक एसक्यूएस कतार से संदेशों को संसाधित करता है:प्रसंस्करण एसक्यूएस कतार बोटो

import boto 
from boto.sqs.message import Message 

conn = boto.connect_sqs() 
q = conn.create_queue('queue-name') 

while (qin.count() > 0): 
    m = q.get_messages() 
    #do something with the message 

जबकि वक्तव्य कथन का उपयोग करना समझ में आता है? वास्तविक समय के रूप में में गिनती() अद्यतन करता है: (? या मैं उन्हें याद करेंगे)

  1. अन्य उदाहरण कतार बंद संदेशों ले (या मैं दोगुना करने के लिए जा रहा हूँ)
  2. नए संदेश कतार में जुड़ जाते हैं

कतार में खाली होने के बावजूद, मैं इस स्क्रिप्ट को लगातार कतार में नए जोड़ों के लिए कैसे सुन सकता हूं?

इस सवाल में Processing items in SQS queue with a php script यह उल्लेख किया गया था 'SQS माणिक क्लाइंट लाइब्रेरी एक विधि "चुनाव" जो लगातार चुनाव कतार और कतार में संदेश प्राप्त करने पर यह एक ब्लॉक करने के लिए जानकारी को साझा करती है' कहते हैं। क्या पाइथन में बराबर है?

यह भी सुझाव दिया गया है कि संदेश कतार की स्थिति की स्क्रिप्ट को सूचित करने के लिए एसएनएस का उपयोग किया जा सकता है लेकिन मुझे नहीं लगता कि आप एसएनएस के साथ एक प्रतिक्रियाशील प्रणाली को कैसे कॉन्फ़िगर कर सकते हैं क्योंकि मीट्रिक अलार्म पर्याप्त दानेदार नहीं हैं।

+0

क्या आप जानते हैं जो गहरे लाल रंग का पुस्तकालय?मैं इसे – Hassek

+0

पर ध्यान देना चाहूंगा क्षमा करें, मैंने इसे ऊपर से जुड़े प्रश्न में देखा है। – waigani

+0

चेकआउट एसएनएस - खींचने के लिए धक्का देना बेहतर है। और वे वास्तव में अच्छी तरह से काम करते हैं http://docs.aws.amazon.com/sns/latest/dg/SendMessageToSQS.html –

उत्तर

6

आपको कतार के लिए गणना पर भरोसा नहीं करना चाहिए क्योंकि यह केवल अनुमानित गणना प्रदान करने के लिए है और सटीक होने की गारंटी नहीं है।

आप बस हमेशा के लिए मतदान रखना चाहते हैं, तो बस इस कार्य करें:

while 1: 
    messages = q.get_messages() 
    # do something with messages 
    time.sleep(N) 

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

कई बार पढ़ने वाले संदेश से बचने के लिए, आपको कतार के दृश्यता समय समाप्ति को एक संदेश संसाधित करने के समय से अधिक मूल्य के रूप में समायोजित करने का प्रयास करना चाहिए और फिर यह सुनिश्चित करना चाहिए कि प्रसंस्करण के दौरान संदेश हटाएं पूरा कर लिया है। (- अदर्शन 0 और 12 घंटे के बीच स्थापित किया जा सकता संपादित)

3
  1. जब आप SQS से एक संदेश खींच, संदेश अदृश्य और अन्य कतार प्रश्नों द्वारा पहुँच योग्य नहीं हो जाता है।
  2. प्रत्येक बार नए संदेश जोड़े जाने पर आपको कतार फिर से प्राप्त करना होगा, लेकिन यह कोई समस्या नहीं होनी चाहिए - यही कारण है कि कतार सेवा पहली जगह मौजूद है।

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

आशा है कि यह सहायक है, अन्यथा बोटो वर्ग documentation के आसपास पोक करें।

+0

संदेश अदृश्यता डिफ़ॉल्ट रूप से 30 सेकंड है, 4 दिन नहीं। और इस अवधि को संशोधित किया जा सकता है। –

2

उदाहरण:

# wait_time_seconds count only 1 request in x seconds (0 - 20) 
# num_messages get x messages in same request (1 - 10) 
while 1: 
    logger.info("... waiting messages ...") 
    messages = queue_in.get_messages(wait_time_seconds=20, num_messages=10) 
    for message in messages: 
     logger.info('message: %s' % (message,)) 
     queue_in.delete_message(message) 
संबंधित मुद्दे