2016-08-03 11 views
7

मेरे पास एक Azure WebJob प्रोजेक्ट है, जो कि मैं अपनी देव मशीन पर स्थानीय रूप से चल रहा हूं। यह एक Azure सेवा बस संदेश कतार सुन रहा है। विषय की तरह कुछ भी नहीं चल रहा है, बस सबसे बुनियादी संदेश कतार।Azure webjob प्रसंस्करण को एक ही संदेश को कई बार समेकित करने के लिए कैसे करें

यह एक ही संदेश को कई बार प्राप्त/प्रसंस्करण कर रहा है, संदेश प्राप्त होने पर तुरंत दो बार लॉन्च हो रहा है, फिर संदेश को संसाधित होने पर अंतःक्रियात्मक रूप से लॉन्च किया जा रहा है।

सवाल:

  • कैसे आ मैं एक ही संदेश कई बार तुरन्त प्राप्त कर रहा हूँ? ऐसा लगता है कि पेकॉकॉक लागू होने से पहले यह फिर से ला रहा है?
  • संदेश अभी भी कैसे प्राप्त किया जा रहा है, भले ही यह अभी भी संसाधित हो रहा है? क्या मैं पेकॉकॉक अवधि निर्धारित कर सकता हूं, या किसी भी तरह संदेश को लॉक कर सकता हूं केवल
  • मैं कैसे सुनिश्चित कर सकता हूं कि कतार पर प्रत्येक संदेश केवल एक बार संसाधित हो जाता है?
  • मैं एक साथ कई संदेशों को संसाधित करने में सक्षम होना चाहता हूं, बस एक ही संदेश को कई बार नहीं, इसलिए MaxConcurrentCalls को 1 पर सेट करना मेरा उत्तर प्रतीत नहीं होता है, या क्या मैं उस संपत्ति को गलत समझ रहा हूं?

मैं एक async समारोह, सरल इंजेक्टर और एक कस्टम JobActivator का उपयोग कर रहा है, तो एक स्थिर शून्य विधि के बजाय, मेरे समारोह हस्ताक्षर है:

public async Task ProcessQueueMessage([ServiceBusTrigger("AnyQueue")] MediaEncoderQueueItem message, TextWriter log) {...} 

काम के अंदर, इसके चारों ओर कुछ फाइलें बढ़ रहा है एक ब्लॉब सेवा पर, और मीडिया सेवाओं से मीडिया एन्कोडर को कॉल करना (और प्रतीक्षा करना)। इसलिए, जब वेब नौकरी स्वयं बहुत प्रसंस्करण नहीं कर रही है, तो इसमें काफी समय लगता है (कुछ फाइलों के लिए 15 मिनट)।

ऐप लॉन्च हो रहा है, और जब मैं कतार में एक संदेश पोस्ट करता हूं, तो यह प्रतिक्रिया देता है। हालांकि, यह संदेश कई बार प्राप्त कर रहा है जैसे ही संदेश प्राप्त होता है: इसके अतिरिक्त (और मैं मीडिया सेवा कार्यक्षमता से उत्पादन को देखने)

Executing: 'Functions.ProcessQueueMessage' - Reason: 'New ServiceBus message detected on 'MyQueue'.' 
Executing: 'Functions.ProcessQueueMessage' - Reason: 'New ServiceBus message detected on 'MyQueue'.' 

, जबकि कार्य चल रहा है, यह एक "कॉपी" मिल जाएगा कतार से।

कार्य पूरा होने के आखिर में, यह अभी भी एक ही संदेश को संसाधित कर रहा है।

+1

कतार में निर्दिष्ट डिलिवरीकाउंट और लॉकडिशन क्या है? –

+0

मुझे इसे देखने की ज़रूरत है। लॉकडिशन के बारे में अजीब चीज यह है कि यह लगभग तुरंत संदेश को दो बार उठा रहा है, जैसे कि यह इसे लॉक नहीं कर रहा है। मुझे आश्चर्य है कि क्या वास्तव में यह एक मुद्दा है जिस तरह से मैंने एसिंक्रोनस हैंडलर स्थापित किया है? – AndrewP

+0

थोड़ा सा लगता है। लॉक अवधि की अवधि समाप्त होने पर ब्रोकर एक प्रतिस्पर्धी उपभोक्ता से भी अधिक संदेश नहीं देगा। मुझे संदेह है कि कुछ और हो रहा है। गिटहब या बिटबकेट पर एक रेपो साझा करने का कोई मौका? –

उत्तर

7

मुझे संदेह है कि क्या हो रहा है निम्न है: अधिकतम DurationLock 5 मिनट हो सकता है। यदि संदेश की प्रसंस्करण 5 मिनट के भीतर की जाती है, तो संदेश को ब्रोकर से पूरा और हटा दिया गया है। अन्यथा, अगर प्रसंस्करण 5 मिनट से अधिक समय लेता है (संदेश पर लॉक खो गया है) तो संदेश फिर से दिखाई देगा और फिर से उपभोग किया जाएगा। आप अपने संदेश के DeliveryCount को देखकर सत्यापित कर सकते हैं।

इसे हल करने के लिए, आप BrokeredMessage.RenewLockAsync() का उपयोग समाप्त होने से पहले संदेश लॉक को नवीनीकृत कर सकते हैं।

+0

मैं उस विधि को देखता हूं, और डिलीवरी गिनती और अवधि लॉक में देखता हूं। अजीब चीज यह है कि यह हर बार नहीं हो रहा है, और ऐसा होने पर बहुत स्थिरता प्रतीत नहीं होती है, और यह भी कि यह एक ही संदेश को दो बार तुरंत प्रसंस्करण प्रतीत होता है। लेकिन उस समारोह को इंगित करने के लिए धन्यवाद! – AndrewP

+0

@AndrewP यदि आपका काम एक अनचाहे अपवाद फेंक रहा है, तो ऑटो-रीट्री का भी एक मामला हो सकता है, और आपके पास सेवा बस कॉन्फ़िगरेशन में स्वत: पूर्णता है। आप अपने ट्रिगर फ़ंक्शन में बस एक फेंक कर इसका परीक्षण कर सकते हैं, फिर विषय पर एक संदेश पोस्ट कर सकते हैं - आपको अधिकतम # रिट्रीज़ तक एक संदेश का पता लगाना चाहिए। – JoeBrockhaus

+0

लॉक स्वचालित रूप से डिफ़ॉल्ट रूप से नवीनीकृत नहीं है? तो 5 मिनट के बाद, प्रसंस्करण अभी भी चल रहा है, तो लॉक स्वचालित रूप से नवीनीकृत हो जाएगा। या क्या मैं कुछ न कुछ भूल रहा हूं? – GETah

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