2015-07-10 7 views
5

प्रसंस्करण बंद कर देता है Azure ServiceBus और OnMessage कॉल का उपयोग करके मैं यह निर्धारित करने का एक तरीका ढूंढ रहा हूं कि ऑनमेसेज इवेंट पंप कतार से पढ़ना बंद कर देता है या नहीं।एज़ूर सर्विस बस, यह निर्धारित करें कि ऑनमेसेज

OnMessage को हमारे कनेक्शन नीचे के रूप में कॉन्फ़िगर किया गया है:

protected virtual void DoSubscription(string queueName, Func<QueueRequest, bool> callback) 
{ 
    var client = GetClient(queueName, PollingTimeout); 
    var transformCallback = new Action<BrokeredMessage>((message) => 
    { 
     try 
     { 
      var request = message.ToQueueRequest(); 
      if (callback(request)) 
      { 
       message.Complete(); 
      } 
      else 
      { 
       message.Abandon(); 
       Log.Warn("DoSubscription: Message Failed to Process Gracefully: {0}{1}", Environment.NewLine, JsonConvert.SerializeObject(request)); 
      } 
     } 
     catch (Exception ex) 
     { 
      Log.Error("DoSubscription: Message Failed to Process With Exception:", ex); 
      message.Abandon(); 
     } 
    }); 
    var options = new OnMessageOptions 
    { 
     MaxConcurrentCalls = _config.GetInt("MaxThreadsPerQueue"), 
     AutoComplete = false, 
     AutoRenewTimeout = new TimeSpan(0,0,1) 
    }; 
    options.ExceptionReceived += OnMessageError; 
    client.OnMessage(transformCallback, options); 
} 

समस्या हम सामना कर रहे हैं समय कोई संदेश के साथ नए संदेश है कि पंक्तिबद्ध कर रहे हैं OnMessage घटना से ही उठाए जा करने के लिए असफल पंक्तिबद्ध किया जा रहा की अवधि के बाद है जब तक एप्लिकेशन पुनरारंभ नहीं हो जाता तब तक पंप करें।

मुझे एहसास है कि वर्कर भूमिकाओं का उपयोग करके ऐसा करने के तरीके हैं, हालांकि निगरानी और प्रबंधन उद्देश्यों के लिए हमने इसे वेब ऐप के एप्लिकेशन स्टार्ट में लागू करने का निर्णय लिया है।

+0

क्या आपने डेडलेटर कतार की जांच की थी? अगर वहां संदेश हैं, तो आपको अपने संदेश प्रसंस्करण के असफल होने के कारणों को देखने में सक्षम होना चाहिए। – mert

+0

डीएल में वे बस टाइमआउट। प्रोग्रामेटिक रूप से प्रक्रिया अभी रुक गई। – VulgarBinary

उत्तर

6

तो माइक्रोसॉफ्ट की एज़ूर सपोर्ट टीम के साथ कॉल के बाद ऑनमेसेज या ऑनमेसेज एसिंक त्रुटियों पर जाल करने की कोई घटना नहीं है। चूंकि ये कॉल अवरुद्ध नहीं कर रहे हैं, यह इवेंट पंप शुरू करता है और निष्पादन थ्रेड पर लौटता है, यह यह निर्धारित करने के लिए एक चुनौती बनाता है कि ऑनमेसेज * यह काम कर रहा है या नहीं। Microsoft से

सुझाव थे:

  • QueueClientBase वर्ग जो OnClose को उजागर करता है, * तरीकों जो आप को संभाल सकता पर की अपनी खुद की कार्यान्वयन बनाएँ। हालांकि, ऐसा करने में आपको संदेश लिफाफे का संचालन करना होगा।
  • एक अलग थ्रेड लूप में ऑनरसीव का उपयोग करें, जिसे आप स्वयं त्रुटियों को जाल कर सकते हैं और तुरंत पुनः प्रयास कर सकते हैं।

हालांकि, मैंने ऑनमेसेज के खिलाफ कुछ बुलेट प्रूफिंग का पता लगाया और कुछ चीजों की खोज की जो मेरे डर को कम कर चुके हैं।

  • OnMessage अविश्वसनीय रूप से गलती है सहिष्णु
    • मैं अपने लैपटॉप से ​​ईथरनेट केबल uplugged वायरलेस के साथ बंद कर दिया, इस सेवा बस कतार में OnMessage का कनेक्शन टूट गया। 10 मिनट इंतजार करने के बाद मैंने ईथरनेट केबल को वापस प्लग किया और ऑनमेसेज ने तुरंत कतारबद्ध तत्वों को संसाधित करना शुरू कर दिया।
  • संदेश पर आश्चर्यजनक रूप से काफी स्थिर है। यह फैक्टरी IdleTimeout के साथ अंत में 72 घंटे के लिए वेब एप्लिकेशन को पुनरारंभ किए बिना 24 घंटों तक सेट के लिए ग्लोबल.एएसएक्स सीएस ऐप स्टार्ट के अंदर चल रहा है।

ऑल-इन सब मैं अब ऑनमेसेज/ऑनमेसेज एसिंक का उपयोग जारी रखने जा रहा हूं और इस पर नजर रखूंगा। अगर मैं उन मुद्दों को देखता हूं जो ऑनमेसेज की मेरी राय बदलते हैं तो मैं इसे अपडेट कर दूंगा।

इसके अलावा - सुनिश्चित करें कि आप एक Azure वेब साइट में स्थायी सुनवाई के लिए OnMessage का उपयोग कर रहे हैं, जिसे आपने "हमेशा चालू" कॉन्फ़िगरेशन विकल्प "चालू" पर सेट किया है। अन्यथा, जब तक OnMessage में कोई वेब अनुरोध नहीं आ जाता है तब तक निपटान नहीं किया जाएगा और HTTP अनुरोध द्वारा वेब एप्लिकेशन को फिर से जांचने तक संदेशों को तब तक संसाधित नहीं किया जाएगा।

+5

बिना किसी बाधा प्रसंस्करण 'ऑनमेसेज' के एक महीने के बाद बिना किसी मुद्दे के काम कर रहा है। इस जंक्शन में मैं कहूंगा कि बिना किसी चिंता के रोके गए राज्य को निर्धारित करने की क्षमता के बिना OnMessage का उपयोग करना स्वीकार्य है।सुरक्षित होने के लिए हमारे पास कतार में सबसे पुराना तत्व जांचने के लिए एक अनावश्यकता है, यदि यह आयु कॉन्फ़िगर की गई आयु से अधिक है तो यह हमें सूचित करेगी। इस दृष्टिकोण के साथ जारी रखने के लिए निष्कर्षों के लिए निष्कर्ष और अधिसूचना के लिए एक घड़ी पर्याप्त है। – VulgarBinary

+2

एक और अनुवर्ती ... अब यह एक वर्ष से अधिक हो गया है। OnMessage के साथ समाधान अभी भी खराब नहीं हुआ है या विफल रहा है। मैं अपने प्रारंभिक बयान से खड़ा हूं, ऑनमेसेज अनचाहे उत्पादन के उपयोग के लिए पर्याप्त लचीला है। – VulgarBinary

+0

आप किस प्रक्रिया में QueueClient को तत्काल करते हैं? और आप कचरा संग्रह कैसे रोकते हैं? –

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