2015-09-25 3 views
6

Ich erstelle eine EventHub-Clientanwendung, die eine Nachricht an einen Event Hub in Azure sendet. Nun, wenn ich eine Nachricht zu senden haben (alle 5-6 Sekunden) ich eine neue Instanz der Klasse EventHubClient, dann verwende ich es, Daten senden:Ist es korrekt, EventHubClient für jede Nachricht zu erstellen, die ich sende?

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

Ist es eine gute Praxis? Oder ist es besser, es nur beim Start zu erstellen und dann nur die .Send-Methode zu verwenden? Was ist das beste Szenario in Bezug auf die Leistung? In der Zukunft könnte die Menge der Nachrichten erhöhen und auch die Menge der Nachrichten

+0

Zusätzlich zu den Antworten unten: stellen Sie fest, dass es in Bezug auf die Leistung im Allgemeinen besser ist, Nachrichten im Stapel mit .SendBatch oder .SendBatchAsync zu senden, anstatt Nachrichten nacheinander zu senden. Vor allem, wenn die Rate der Nachrichten höher wird. Es hängt davon ab, wie schnell diese Nachrichten an den EventHub gesendet werden sollen. –

+0

@PeterBons Ich stimme dir zu. Die Verwendung von Nachrichtenstapeln ist immer eine gute Wahl. In meinem Fall beschränke ich den Stapel auf die maximal erlaubte Stapelgröße und wenn er voll ist, sende ich den Stapel (ich habe eine riesige Anzahl von Nachrichten). –

Antwort

2

Nein, es ist notwendig, einen neuen EventHubClient mit der MessageFactory nur beim ersten Mal zu erstellen. Wenn ich für jede Nachricht, die ich sende, einen Client anlege, wird eine neue Verbindung erstellt und die alte bleibt geöffnet (überprüft mit netstat), was zu vielen "ESTABILISED" -Verbindungen führt.

Mit einem einzigen Client für die erste Nachricht erstellt, dann den Client für die anderen Nachrichten recyceln, wenn die Internetverbindung verloren ist, dann kommt zurück, die TCP-Verbindung wird automatisch neu erstellt. Hier

+0

Wie können Sie das in ASP.net Web API tun? Können Sie ein Codebeispiel zeigen? –

+0

@KemalCanKara Ich habe ein Beispiel für die Client-Erstellung mit Factory –

+0

@AndreaCattaneo, was ist Ihre Referenz für Ihre Antwort? –

1

Ja ist es richtig, Sie könnten ein neues EventHubClient jedes Mal erstellen, wäre es in Ordnung.

Intern wird dieselbe zugrunde liegende TCP-Verbindung wiederverwendet, wenn die Verbindungszeichenfolge dieselbe ist. EventHubClient speichert die Ergebnisse der MessageFactory.Create(...) Methoden, die es verwendet.

+0

Leider ist das nicht korrekt. Wenn ich jedes Mal einen neuen EventHubClient erstelle, wird eine neue Verbindung mit einer neuen Portnummer erstellt. Ich habe es heute nach Problemen auf dem Spielfeld überprüft. –

0

ist ein Beispiel für eine Client-Erstellung unter Verwendung von Werk:

  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

einen Client Erstellen direkt die EventHubClient.CreateFromConnectionString mit (...) wird eine neue TCP-Verbindung für jeden Kunden erstellen. Wenn jedoch der Client unter Verwendung eines gemeinsam genutzten MessagingFactory Schaffung

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

der Client die darunter liegende TCP-Verbindung wieder verwenden. Aus der Dokumentation: Create an Event Hubs client

Verwandte Themen