2015-09-25 7 views
6

मैं एक EventHub क्लाइंट एप्लिकेशन बना रहा हूं जो Azure पर इवेंट हब को संदेश भेजता है। अब जब मैं भेजने के लिए एक संदेश है (हर 5-6 सेकंड) मैं कक्षा EventHubClient का एक नया उदाहरण बनाने के लिए, तो मैं इसका इस्तेमाल डेटा भेजने के लिए:क्या मैं भेजे गए प्रत्येक संदेश के लिए EventHubClient बनाने में सही है?

public async static void SendListOfMeasurements(string eventHubName, string connectionString, List<Measurement> measurementsList, int maxMessageSize) 
    { 
     // Create EventHubClient 
     EventHubClient client = EventHubClient.CreateFromConnectionString(
      connectionString, 
      eventHubName); 
     ... 

यह एक अच्छा अभ्यास है? या यह केवल स्टार्टअप पर इसे बनाना बेहतर है और फिर केवल Send विधि का उपयोग करें? प्रदर्शन के मामले में सबसे अच्छा परिदृश्य क्या है? भविष्य में भेजने की राशि बढ़ सकती है और संदेश की मात्रा

+0

नीचे दिए गए उत्तरों के अतिरिक्त: यह समझें कि, प्रदर्शन के संदर्भ में, आमतौर पर संदेशों को भेजने के बजाय सैंडबैच या .SendBatchAsync का उपयोग करके बैच में संदेश भेजना बेहतर होता है। विशेष रूप से जब संदेश की दर अधिक हो जाती है। यह इस बात पर निर्भर करता है कि आप इन संदेशों को EventHub पर कितनी तेजी से वितरित करना चाहते हैं। –

+0

@ पीटरबोन मैं आपके साथ सहमत हूं। संदेशों के बैच का उपयोग करना हमेशा एक अच्छा विकल्प है। मेरे मामले में मैं बैच को अधिकतम स्वीकृत बैच आकार तक सीमित करता हूं और फिर जब यह पूरा हो जाता है तो मैं बैच भेजता हूं (मेरे पास एक बड़ी संदेश राशि है)। –

उत्तर

2

नहीं, संदेशफैक्टरी का उपयोग करके केवल एक नया EventHubClient बनाना आवश्यक है। यदि मैं प्रत्येक संदेश के लिए क्लाइंट बनाता हूं, तो एक नया कनेक्शन बनाया जाता है और पुराना एक खोला जाता है (नेटस्टैट का उपयोग करके चेक किया जाता है) जिसके परिणामस्वरूप बहुत से "स्थापित" कनेक्शन होते हैं।

पहले संदेश के लिए बनाए गए एकल क्लाइंट का उपयोग करना, फिर इंटरनेट कनेक्शन खो जाने पर क्लाइंट को अन्य संदेशों के लिए रीसाइक्लिंग करना, फिर वापस आता है, टीसीपी कनेक्शन स्वचालित रूप से फिर से बनाया जाता है।

  var endpointUri = ServiceBusEnvironment.CreateServiceUri("sb", eventHubNamespace, string.Empty); 

      MessagingFactory factory = MessagingFactory.Create(endpointUri, new MessagingFactorySettings 
      { 
       TokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider(sasToken), 
       TransportType = TransportType.Amqp 
      }); 

      factory.RetryPolicy = new RetryExponential(TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(30), 3); 

      client = factory.CreateEventHubClient(eventHubName); 
+0

आप एएसपीनेट वेब एपीआई में ऐसा कैसे कर सकते हैं? क्या आप कुछ कोड उदाहरण दिखा सकते हैं? –

+0

@ केमलकनकार I ने कारखाने –

+0

@AndreaCattaneo का उपयोग करके क्लाइंट निर्माण का एक उदाहरण जोड़ा, आपके उत्तर के लिए आपका संदर्भ क्या है? –

1

हां यह सही है, आप हर बार एक नया EventHubClient बना सकते हैं, यह ठीक होगा।

आंतरिक रूप से, कनेक्शन स्ट्रिंग समान है, तो यह उसी अंतर्निहित टीसीपी कनेक्शन का पुन: उपयोग करता है। EventHubClient कैश के परिणाम MessageFactory.Create(...) विधियों का उपयोग करते हैं।

+0

दुर्भाग्य से यह गलत है। यदि मैं हर बार एक नया EventHubClient बना देता हूं, तो एक नया पोर्ट नंबर वाला नया कनेक्शन बनाया जाता है। मैंने मैदान पर समस्याओं के बाद आज इसे जांच लिया। –

0

यहाँ कारखाने का उपयोग कर एक ग्राहक निर्माण का एक उदाहरण है। हालांकि, जब ग्राहक बनाने के लिए एक साझा MessagingFactory

var factory = MessagingFactory.CreateFromConnectionString("your_connection_string"); 
var client = factory.CreateEventHubClient("MyEventHub"); 

का उपयोग कर ग्राहक अंतर्निहित TCP कनेक्शन पुन: उपयोग होगा। दस्तावेज़ों से: Create an Event Hubs client

0

एक ग्राहक सीधे EventHubClient.CreateFromConnectionString (...) का उपयोग करते हुए प्रत्येक ग्राहक के लिए एक नया TCP कनेक्शन पैदा करेगा बनाना:

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

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