2015-07-09 5 views
10

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

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

मैं दो क्षेत्रों है मैं इस डिजाइन

  1. यह एक लंबे time_out मूल्य के साथ receive_message() कॉल की बात है के साथ के बारे में यकीन नहीं है और अगर कुछ भी नहीं 20 सेकंड में दिया जाता है (अधिकतम स्वीकृत) तो बस पुनः प्रयास करें? या क्या कोई अवरोधन विधि है जो केवल एक बार डेटा उपलब्ध हो जाती है?
  2. मैंने देखा कि एक बार मुझे संदेश प्राप्त होने के बाद, यह कतार से हटाया नहीं गया है, क्या मुझे एक संदेश प्राप्त करना है और फिर इसे कतार से हटाने के लिए इसे प्राप्त करने के बाद एक और अनुरोध भेजना है? एक ओवरकिल की तरह लगता है।

धन्यवाद

उत्तर

11

receive_message() विधि की लंबे समय से मतदान क्षमता SQS मतदान पर सबसे कारगर तरीका है। अगर वह किसी भी संदेश के बिना लौटता है, तो मैं पुनः प्रयास करने से पहले एक छोटी देरी की सिफारिश करता हूं, खासकर यदि आपके पास एकाधिक पाठक हैं। आप एक वृद्धिशील देरी भी कर सकते हैं ताकि प्रत्येक बाद के खाली पठन थोड़ी देर तक इंतजार कर सके, बस आप एडब्ल्यूएस द्वारा थ्रॉटलिंग नहीं कर पाएंगे।

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

3

एक और विकल्प this blogpost में वर्णित एडब्ल्यूएस बीनस्टॉक का उपयोग करके एक कार्यकर्ता अनुप्रयोग स्थापित करना है।

boto3 का उपयोग करके लंबे मतदान के बजाय, आपके फ्लास्क एप्लिकेशन को HTTP पोस्ट में एक जेसन ऑब्जेक्ट के रूप में संदेश प्राप्त होता है। HTTP पथ और संदेश के प्रकार स्थापित किया जा रहा एडब्ल्यूएस लचीला बीनस्टॉक विन्यास टैब में विन्यास हैं:

enter image description here

एडब्ल्यूएस लचीला बीनस्टॉक गतिशील के एक समारोह के रूप में श्रमिकों की संख्या पैमाने पर करने में सक्षम होने का अतिरिक्त लाभ है इसके तैनाती प्रबंधन लाभ के साथ, आपके एसक्यूएस कतार का आकार।

This एक उदाहरण एप्लिकेशन है जिसे मैंने टेम्पलेट के रूप में उपयोगी पाया।

2

आप एक श्रोता कि संदेशों के स्वत: हटाए जाने के लिए जब वे कर रहे हैं संसाधित किया जा रहा समाप्त, और स्वत: एक निर्दिष्ट कतार में अपवादों में से धक्का शामिल स्थापित करने के लिए एक आसान तरीका चाहते हैं, आप pySqsListener पैकेज का उपयोग कर सकते हैं।

आप इस प्रकार का श्रोता सेट कर सकते हैं:

from sqs_listener import SqsListener 

class MyListener(SqsListener): 
    def handle_message(self, body, attributes, messages_attributes): 
     run_my_function(body['param1'], body['param2'] 

listener = MyListener('my-message-queue', 'my-error-queue') 
listener.listen() 

पल पैकेज कम मतदान का उपयोग करता है, लेकिन मैं मतदान विन्यास के प्रकार बनाने पर विचार कर रहा हूँ।

अस्वीकरण: मैं कहा पैकेज के लेखक हूं।

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