0

Azure Web サイトでホストされているジョブがあり、ジョブはトピック サブスクリプションからエントリを読み取ります。Web サイトをホストするインスタンスが 1 つしかない場合、すべてが正常に機能します。複数のインスタンスにスケールアウトすると、メッセージがインスタンスの数だけ処理されることがわかります。各インスタンスは同じサブスクリプションを指します。私たちが読んだことから、アイテムが読み取られると、他のプロセスでは使用できなくなります。重複した処理は同じインスタンス内で発生しています。つまり、2 つのインスタンスがある場合、アイテムはインスタンスの 1 つで 2 回処理され、分割されません。

私たちが物事を行う方法で何が間違っている可能性がありますか? これは、キューへの接続を構成する方法です。サブスクリプションが存在しない場合は、作成されます。

 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 Web サイトが複数のインスタンスにスケーリングされる場合は常に、すべてのインスタンスが同じ構成を共有します。

4

2 に答える 2

0

既存のインスタンスにフックするのではなく、新しいインスタンスが実行されるたびに新しいサブスクリプションを作成しているようです。トピックは、複数のサブスクライバーが同じ方法でアタッチできるように設計されていますが、通常は各サブスクライバーの目的が異なるため、それぞれがメッセージのコピーを表示します。

あなたのコード スニペットからこれを確認することはできませんが、それは私の推測です - 構成ファイルは同一ですか? プロセスが実行されるたびに CreateSubscription() を呼び出しているかどうかを確認するために、トレース出力を追加する必要があります。

于 2016-06-24T21:52:28.403 に答える