【发布时间】:2019-03-21 08:50:51
【问题描述】:
我有一个 asp.net 核心应用程序,它在启动时将订阅客户端注册到一个主题 (IHostedService),这个订阅客户端本质上有一个回调字典,当它检测到带有 id 的主题中的新消息(此 id 存储在消息属性中)。该字典在应用程序的整个生命周期中都存在,并且在内存中。
在 azure 上的 asp.net 核心应用服务的单个实例上一切正常,一旦我扩展到 2,我注意到有时订阅中的回调没有触发。这是有道理的,因为我们现在有两个实例,每个实例都有自己的回调字典存储。
所以我更新了代码检查订阅的id是否存在,如果不存在则放弃消息,如果存在则获取回调并调用它。
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 时,同一个实例又拿起了消息?
我想我真正想问的是,如果我有多个主题订阅客户端实例都指向该主题的同一个订阅者,是否所有实例都可以获得消息的副本?还是不能保证。
【问题讨论】:
标签: asp.net-core azureservicebus azure-servicebus-topics