0

Wir haben einen Job in einer azurblauen Website gehostet, liest der Job Einträge aus einem Thema Abonnement. Alles funktioniert gut, wenn wir nur eine Instanz für die Website haben. Sobald wir auf mehr als eine Instanz skaliert haben, beobachten wir, dass die Nachricht so oft wie Instanzen verarbeitet wird. Jede Instanz verweist auf dasselbe Abonnement. Von dem, was wir gelesen haben, wird es, sobald es gelesen wurde, für keinen anderen Prozess verfügbar sein. Die duplizierte Verarbeitung findet innerhalb derselben Instanz statt, dh wenn zwei Instanzen vorhanden sind, wird das Element zweimal in einer der Instanzen verarbeitet. Es wird nicht aufgeteilt.Same Azure Thema wird mehrmals verarbeitet

Was kann in der Art, wie wir Dinge tun, falsch sein? Dies ist, wie wir die Verbindung in die Warteschlange zu konfigurieren, gehen Sie, wenn das Abonnement nicht existiert, es erstellt wird:

var serviceBusConfig = new ServiceBusConfiguration 
     { 
      ConnectionString = transactionsBusConnectionString 
     }; 
     config.UseServiceBus(serviceBusConfig); 

     var allRule1 = new RuleDescription 
     { 
      Name = "All", 
      Filter = new TrueFilter() 
     }; 
     SetupSubscription(transactionsBusConnectionString,"topic1", "subscription1", allRule1); 


    private static void SetupSubscription(string busConnectionString, string topicNameKey, string subscriptionNameKey, RuleDescription newRule) 
    { 
     var namespaceManager = 
      NamespaceManager.CreateFromConnectionString(busConnectionString); 
     var topicName = ConfigurationManager.AppSettings[topicNameKey]; 
     var subscriptionName = ConfigurationManager.AppSettings[subscriptionNameKey]; 
     if (!namespaceManager.SubscriptionExists(topicName, subscriptionName)) 
     { 
      namespaceManager.CreateSubscription(topicName, subscriptionName); 
     } 
     var subscriptionClient = SubscriptionClient.CreateFromConnectionString(busConnectionString, topicName, subscriptionName); 
     var rules = namespaceManager.GetRules(topicName, subscriptionName); 

     foreach (var rule in rules) 
     { 
      subscriptionClient.RemoveRule(rule.Name); 
     } 
     subscriptionClient.AddRule(newRule); 

     rules = namespaceManager.GetRules(topicName, subscriptionName); 
     rules.ToString(); 
    } 

Beispiel des Codes, der das Thema Artikel bearbeiten:

public void SendInAppNotification(
     [ServiceBusTrigger("%eventsTopicName%", "%SubsInAppNotifications%"), ServiceBusAccount("OutputServiceBus")] Notification message) 
    { 
     this.valueCalculator.AddInAppNotification(message); 
    } 

Diese Methode ist in einer statischen Klasse Funktion, ich verwende azurblauen Web-Job sdk.

Wenn die azure Website auf mehr als eine Instanz skaliert wird, haben alle Instanzen dieselbe Konfiguration.

+1

Wie sieht Ihre Verarbeitungslogik aus? Möglicherweise sperren Sie die Nachricht nicht oder Sie schließen die Nachricht möglicherweise nicht ordnungsgemäß ab. – JTaub

+0

Irgendwelche Updates zu Ihrem Problem? – Thomas

+0

Die SDK kümmert sich um die Fertigstellung der Nachricht, ich habe immer noch das Problem, aber ich habe eine Trace zum Erstellen Abonnement-Teil hinzugefügt, um zu verifizieren, dass es mehrmals erstellt wird. Nun, selbst in diesem Fall verwendet es denselben Subskriptionsnamen, aber es ist keine schlechte Idee, diese Verfolgung zu schmücken. – user1075679

Antwort

0

Es hört sich so an, als ob Sie jedes Mal, wenn Ihre neue Instanz ausgeführt wird, ein neues Abonnement erstellen, anstatt sich in ein vorhandenes einklinken zu müssen. Die Themen sind so gestaltet, dass mehrere Teilnehmer sich auch auf diese Weise anhängen können - normalerweise, obwohl jeder Teilnehmer einen anderen Zweck hat, so dass jeder eine Kopie der Nachricht sieht.

Ich kann dies nicht von Ihrem Code-Snippet überprüfen, aber das ist meine Vermutung - sind die Konfigurationsdateien identisch? Sie sollten eine Ablaufverfolgungsausgabe hinzufügen, um zu sehen, ob Ihre Prozesse bei jeder Ausführung CreateSubscription() aufrufen.

+0

In der Tat sollte der Prozess die Subskription nicht erstellen, wenn sie bereits existiert, aber sie überschreibt alle Subskriptionsregeln. – user1075679

+0

Ich werde dem createsubscription Teil Tracing hinzufügen, nur für den Fall, das ist eine großartige Idee, danke. – user1075679

+0

Hmm, also sind Sie sicher, dass Sie die Nachricht nur einmal einstellen, verfolgen Sie eine eindeutige ID pro Nachricht? –

0

Ich denke, ich kann auf die Nachricht ID zugreifen, ich benutze azurblauen Web-Job sdk, aber ich denke, ich kann einen Weg finden, um es zu bekommen. Lass es mich überprüfen und lass es dich wissen.