我们在azure网站上托管了一份工作,该工作从主题订阅中读取条目。当我们只有一个实例来托管网站时,一切正常。一旦我们扩展到多个实例,我们就会观察到消息的处理次数与我们的实例一样多。每个实例都指向相同的订阅。从我们阅读的内容来看,一旦阅读了该项目,它将无法用于任何其他过程。重复处理发生在同一个实例中,这意味着如果我们有两个实例,则在其中一个实例中处理该项两次,它不会被拆分。
我们做事的方式有什么可能是错的? 这就是我们如何继续配置与队列的连接,如果订阅不存在,则创建它:
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();
}
处理主题项的代码示例:
public void SendInAppNotification(
[ServiceBusTrigger("%eventsTopicName%", "%SubsInAppNotifications%"), ServiceBusAccount("OutputServiceBus")] Notification message)
{
this.valueCalculator.AddInAppNotification(message);
}
此方法位于Function静态类中,我正在使用azure web job sdk。
每当azure网站扩展到多个实例时,所有实例都共享相同的配置。
答案 0 :(得分:0)
听起来你每次新实例运行时都会创建一个新订阅,而不是挂钩到现有订阅。主题旨在允许多个订阅者以这种方式附加 - 通常虽然每个订阅者具有不同的目的,因此他们每个都看到消息的副本。
我无法从您的代码段验证这一点,但这是我的猜测 - 配置文件是否相同?您应该添加一些跟踪输出,以查看您的进程每次运行时是否正在调用CreateSubscription()。
答案 1 :(得分:0)
我想我可以访问消息ID,我正在使用azure web job sdk,但我想我可以找到一种方法来获取它。让我检查一下,让你知道。