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