У меня есть ситуация, когда у меня есть основное приложение asp.net, которое регистрирует клиента подписки на тему при запуске (IHostedService
), этот клиент подписки, по сути, имеет словарь обратных вызовов, которые необходимо запускать всякий раз, когда он обнаруживаетновое сообщение в теме с идентификатором (этот идентификатор хранится в свойствах сообщения).Этот словарь действует в течение всего жизненного цикла приложения и находится в памяти.
Все отлично работает на одном экземпляре основной службы приложений asp.net в Azure, как только я масштабируюсь до 2, я замечаючто иногда обратные вызовы в подписке не запускаются.Это имеет смысл, поскольку у нас теперь есть два экземпляра, каждый со своим собственным хранилищем обратных вызовов в словаре.
Поэтому я обновил код, чтобы проверить, существует ли идентификатор подписки, если нет, отменить сообщение, если да,получить обратный вызов и вызвать его.
public async Task HandleMessage(Microsoft.Azure.ServiceBus.Message message, CancellationToken cancellationToken)
{
var queueItem = this.converter.DeserializeItem(message);
var sessionId = // get the session id from the message
if (string.IsNullOrEmpty(sessionId))
{
await this.subscriptionClient.AbandonAsync(message.SystemProperties.LockToken);
return;
}
if (!this.subscriptions.TryGetValue(sessionId, out var subscription))
{
await this.subscriptionClient.AbandonAsync(message.SystemProperties.LockToken);
return;
}
await subscription.Call(queueItem);
// subscription was found and executed. Complete message
await this.subscriptionClient.CompleteAsync(message.SystemProperties.LockToken);
}
Однако проблема по-прежнему возникает.Мое единственное предположение состоит в том, что при вызове AbandonAsync
тот же экземпляр снова получает сообщение?
Я думаю, что я действительно пытаюсь спросить, если у меня есть несколько экземпляров клиента подписки на тему, все указывающиеодному и тому же подписчику по теме, возможно ли для всех экземпляров получить копию сообщения?Или это не гарантировано.