代码之家  ›  专栏  ›  技术社区  ›  Umair

Azure服务总线同一订阅服务器的多个实例

  •  0
  • Umair  · 技术社区  · 6 年前

    我有一个asp.net核心应用程序,它在启动时向主题注册订阅客户端( IHostedService

    在azure上的asp.net核心应用程序服务的一个实例上,一切都很正常,当我扩展到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 ,同一实例又在接收消息?

    我想我真正想问的是,如果一个主题订阅客户端的多个实例都指向该主题的同一个订阅服务器,那么所有实例都有可能获得消息的副本吗?或者这不能保证。

    2 回复  |  直到 6 年前
        1
  •  5
  •   Sean Feldman    6 年前

    不,如果是 相同的 所有客户端指向的订阅,只有一个将接收该消息。

    为了解决这个问题,您需要有一个共享的/集中的体系结构,或者改变您的体系结构。

        2
  •  0
  •   Umair    6 年前

    我通过使用服务总线会话成功地解决了这个问题。我想用回调字典做的基本上就是一个会话管理器!

    服务总线会话允许一个会话客户端的多个实例都指向同一个订阅。但是,每个实例将只知道或关心它当前正在处理的会话。