我们在一个 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 网站扩展到多个实例时,所有实例都共享相同的配置。