同一Azure主题被多次处理

时间:2016-06-24 21:00:43

标签: azure azure-webjobs azure-webjobssdk azure-servicebus-topics

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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