2013-07-11 7 views
9

मेरे पास Azure सेवा बस कोड के आस-पास एक मूल आवरण है जो हम एक कार्यकर्ता भूमिका के भीतर उपयोग करेंगे। जब भी कार्यकर्ता की भूमिका चलती है तो यह ServiceBusClient तत्काल हो जाएगा; तब तक कतार तक पहुंचने के लिए उपयोग किया जाता है जब तक कि कोई शेष आइटम गुजरने के लिए छोड़ा न जाए।Azure सेवा बस ग्राहक कनेक्शन दृढ़ता

public class ServiceBusClient : IDisposable, IServiceBusClient 
{ 
    private const int DEFAULT_WAIT_TIME_IN_SECONDS = 120; 

    private const string SERVICE_BUS_CONNECTION_STRING_KEY = "service.bus.connection.string"; 

    private readonly MessagingFactory _messagingFactory; 

    private readonly NamespaceManager _namespaceManager; 

    private readonly QueueClient _queueClient; 

    private readonly ISettingsManager _settingsManager; 

    public ServiceBusClient(ISettingsManager settingsManager, string queueName) 
    { 
     _settingsManager = settingsManager; 

     var connectionString = _settingsManager.GetSetting<string>(SERVICE_BUS_CONNECTION_STRING_KEY); 

     _namespaceManager = NamespaceManager.CreateFromConnectionString(connectionString); 
     _messagingFactory = MessagingFactory.CreateFromConnectionString(connectionString); 

     _queueClient = GetOrCreateQueue(queueName); 
    } 

    public void Dispose() 
    { 
     _messagingFactory.Close(); 
    } 

    public BrokeredMessage ReceiveTopMessage() 
    { 
     return _queueClient.Receive(TimeSpan.FromSeconds(DEFAULT_WAIT_TIME_IN_SECONDS)); 
    } 

    public void SendMessage(object bodyObject) 
    { 
     var message = new BrokeredMessage(bodyObject); 

     _queueClient.Send(message); 
    } 

    private QueueClient GetOrCreateQueue(string queueName) 
    { 
     var queue = !_namespaceManager.QueueExists(queueName) 
         ? _namespaceManager.CreateQueue(queueName) 
         : _namespaceManager.GetQueue(queueName); 

     return _messagingFactory.CreateQueueClient(queue.Path, ReceiveMode.PeekLock); 
    } 

} 

आप मैं NamespaceManager, MessagingFactory और QueueClient आरंभ निर्माता के अंदर देख सकते हैं: वे तो पुन: उपयोग कर रहे हैं जब SendMessage() और ReceiveTopMessage() कनेक्शन एक Dispose() विधि का उपयोग कर बंद के साथ बुला।

मेरा सवाल यह है कि मैं जिस दृष्टिकोण का उपयोग कर रहा हूं वह है सुरक्षित; QueueClient का एक उदाहरण तब तक खुला होगा जब एक कार्यकर्ता भूमिका कतार पर सभी संदेशों के माध्यम से गिनती करेगी (एक प्रक्रिया जो ReceiveTopMessage() पर कॉल के बीच लंबे इंतजार के साथ कनेक्शन को थोड़ी देर के लिए खोल सकती है) लगातार क्षणिक मुद्दों के बिना काम करती है, या क्या यह हर बार कनेक्शन खोलने और बंद करने के लिए समझदार है?

एक तरफ के रूप में; माइक्रोसॉफ्ट सर्विस बस कोड में क्षणिक गलती हैंडलिंग कैसे आयोजित की जाती है? क्या यह डिफ़ॉल्ट रूप से आयोजित किया जाता है या क्या हमें Transient Fault Handling Framework को लागू करने की आवश्यकता है?

उत्तर

9

QueueClient class उस कनेक्शन का उपयोग करता है जो इसे बनाने के लिए उपयोग किए जाने वाले मैसेजिंग फैक्टरी ऑब्जेक्ट द्वारा प्रबंधित किया जाता है। एकाधिक अनुरोधों के लिए एक ही ग्राहक ऑब्जेक्ट का पुन: उपयोग करने की अनुशंसा की जाती है। के रूप में Best Practices for Performance Improvements Using Service Bus Brokered Messaging में प्रलेखित: सेवा बस ग्राहक प्रोटोकॉल, और HTTP:

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

क्षणिक गलती से निपटने के बारे में, QueueClient एक RetryPolicy property कि निर्धारित करता है कि क्या अनुरोध पुनः प्रयास किया जाना चाहिए। Transient Fault Handling Application Block भी है, जो क्षणिक फॉल्ट हैंडलिंग फ्रेमवर्क का अधिग्रहण करता है।

संदेश प्राप्त करने के बारे में 0,में मार्गदर्शन है।माइक्रोसॉफ्ट ने मान्यता दी है कि एक अच्छी तरह से लिखे गए, लचीले संदेश को लूप प्राप्त करना मुश्किल है, इसलिए उन्होंने एक विकल्प के रूप में Event-Driven Message Programing Model पेश किया है।

+1

उत्कृष्ट लिंक आपको धन्यवाद; मैं अपने रैपर में [विश्वसनीय संदेश प्राप्त लूप लागू) [http://msdn.microsoft.com/en-us/library/windowsazure/hh851750.aspx) का उपयोग करूँगा। यदि 'QueueClient' क्लास कनेक्शन नहीं खोलता है; क्या यह स्वचालित रूप से संभाला जाता है जब 'रीसीविव()' जैसी विधि कहा जाता है? –

+1

मैंने अनुशंसित उपयोग पैटर्न के बारे में अतिरिक्त दस्तावेज के साथ अपना उत्तर स्पष्ट किया है और कौन सा ऑब्जेक्ट टीसीपी कनेक्शन को संभालता है। –

+0

मेरा प्रश्न इस प्रश्न से संबंधित है यदि आप एक नज़र देख सकते हैं: http://stackoverflow.com/questions/33512803/service-bus-singleton-connection-class @FernandoCorreia – Ron

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