gpt4 book ai didi

asp.net-core - 同一订阅者的 Azure 服务总线多个实例

转载 作者:行者123 更新时间:2023-12-02 00:28:31 25 4
gpt4 key购买 nike

我有一个 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 时,同一个实例再次获取消息?

我想我真正想问的是,如果我有一个主题订阅客户端的多个实例都指向该主题的同一个订阅者,是否所有实例都可以获得消息的副本?还是不能保证。

最佳答案

if I have multiple instances of a topic subscription client all pointing to the same subscriber for the topic, is it possible for all the instances to get a copy of the message? Or is that not guaranteed.

没有。如果它是所有客户端都指向的相同订阅,则只有一个会收到该消息。

您遇到了与竞争消费者进行横向扩展的问题。如果你要横向扩展,你永远不知道哪个实例会选择消息。并且由于您的状态是本地的(在每个实例的内存中),因此有时会失败。额外的缺点是成本。通过在“错误的”实例上获取消息并放弃,您将在消息传递方面付出更高的代价。

要解决此问题,您要么需要共享/集中化,要么围绕此更改您的架构。

关于asp.net-core - 同一订阅者的 Azure 服务总线多个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52841930/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com