当前位置: 首页 > 知识库问答 >
问题:

Azure服务总线-多个订户不接收所有消息

常炯
2023-03-14

我正在使用代码实现Azure服务总线主题,这些主题可以在以下位置找到:https://docs.microsoft.com/en-us/Azure/service-bus-messaging/service-bus-dotnet-how-to-use-topics-subscriptions

我尝试运行订阅者程序的两个实例,它包含以下方法:

private static void RegisterOnMessageHandlerAndReceiveMessages()
{
    var messageHandlerOptions = new MessageHandlerOptions(ExceptionReceivedHandler)
    {
        MaxConcurrentCalls = 1,
        AutoComplete = false
    };
    _subscriptionClient.RegisterMessageHandler(ProcessMessagesAsync, messageHandlerOptions);
}

private static async Task ProcessMessagesAsync(Message message, CancellationToken token)
{
    Console.WriteLine($"Received #{message.SystemProperties.SequenceNumber} message: {Encoding.UTF8.GetString(message.Body)}");
    await _subscriptionClient.CompleteAsync(message.SystemProperties.LockToken);
}

但是,这不允许两个订户都接收消息,它接收的消息是两个订户各自分离的一条消息。

如何确保两个订户都能收到来自总线的所有消息?

共有1个答案

殷永嘉
2023-03-14

当涉及到检索消息时,Azure服务总线是一个具有竞争消费者模式的代理。这是意料之中的行为。这里有一个扩展的处理endpoint,两个endpoint都试图处理来自同一订阅的消息。消息在这两个竞争的消费者之间分发。如果需要将同一消息分发到多个订阅服务器,则应创建并侦听不同的订阅实体。

 类似资料:
  • 我正在使用azure service bus主题,我已经为它订阅启用了会话。 在my logic应用程序中,我使用来自主题的sql事务插入数据,我使用主题订阅(peek-lock)并在订阅服务器级别将并发设置为默认,如下所示 根据我的理解,我的逻辑应用程序(订阅者)应该读取所有的消息,并且必须在FIFO中处理 我的逻辑应用程序像

  • 我有一个超时选项,只想在超时前接收消息。 如果您能解释下面的代码是如何工作的,以及我如何修改下面的代码以在特定的时间框架内接收消息,并且一旦我的超时已经到达就停止接收,这将是很有帮助的。

  • 这是我能找到的最接近的前一个问题:Azure Service Bus Subscription OnMessage未接收消息。 同样的事情也发生在我身上。当我改变主题的名称时,它会再次工作一段时间。则该服务总线主题再次损坏。只有65-71%的消息到达。无助于删除子内容,也无助于删除主题。题名似乎过了一段时间不知怎么就被污染了。这是真的真的很糟糕,因为我没有办法告诉什么时候主题是腐败的,除了系统不像

  • null 输出 谁能解释一下为什么会这样吗?这对我来说有点迷惑?

  • 参考https://github.com/Azure/azure-service-bus/tree/master/samples/dotnet/gettingstart/microsoft.Azure.servicebus/basicsendreceiveusingtopicsubscriptionclient,我了解Azure服务总线主题的一般工作方式,我的问题更多地是关于它实际上是如何工作的。

  • 但是,问题还是出现了。我唯一的猜测是,当调用时,同一个实例再次拾取消息? 我想我真正想问的是,如果我有一个主题订阅客户端的多个实例都指向该主题的同一个订阅者,那么所有实例是否都有可能获得消息的副本?还是不保证。