0

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

4

2 回答 2

0

听起来您每次运行新实例时都在创建一个新订阅,而不是挂钩到现有的订阅。主题旨在允许多个订阅者也以这种方式附加 - 通常虽然每个订阅者都有不同的目的,所以他们每个人都会看到消息的副本。

我无法从您的代码片段中验证这一点,但这是我的猜测 - 配置文件是否相同?您应该添加一些跟踪输出以查看您的进程是否在每次运行时都调用 CreateSubscription()。

于 2016-06-24T21:52:28.403 回答
0

我想我可以访问消息 ID,我正在使用 azure web job sdk,但我想我可以找到一种方法来获取它。让我检查一下,然后告诉你。

于 2016-06-30T01:00:56.943 回答