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.
Wie sieht Ihre Verarbeitungslogik aus? Möglicherweise sperren Sie die Nachricht nicht oder Sie schließen die Nachricht möglicherweise nicht ordnungsgemäß ab. – JTaub
Irgendwelche Updates zu Ihrem Problem? – Thomas
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