繁体   English   中英

Azure 服务总线 - 多个订阅者不会收到所有消息

[英]Azure Service Bus - Multiple subscribers don't receive all messages

我正在使用代码来实现可以在此处找到的 Azure 服务总线主题: https ://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-dotnet-how-to- 使用主题订阅

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

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);
}

在此处输入图像描述

但是,这不允许两个订阅者都收到消息,它会收到一条消息,每个消息都拆分给两个订阅者。

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

在检索消息时,Azure 服务总线是具有竞争消费者模式的代理。 这是预期的行为。 您在这里拥有的是一个横向扩展的处理端点,两者都在尝试处理来自同一订阅的消息。 消息在这两个竞争的消费者之间分发。 如果您需要将相同的消息分发给多个订阅者,您应该创建和收听不同的订阅实体。

值得说明的是——因为从任何文档中都看不到——每个主题都应该为每个订阅者设置订阅。

即,如果我有 3 个订阅者:

/myservicebus/mytopic/mysubscription1
/myservicebus/mytopic/mysubscription2
/myservicebus/mytopic/mysubscription3

我期待 - 可能与 OP 相同 - 主题和订阅者被自动配置为 one:many。

本质上,如果多个订阅者被配置为同一个订阅,那么这将成为“第一个订阅者获胜”的场景——就像它是一个队列一样。

我也遇到了这个。

我通过制作一个额外的微服务来解决这个问题,只是为了转发消息。 转发器服务本身必须订阅您的每个订阅者必须接收的消息。 每个订阅者都向事件转发服务注册自己(使用唯一的 id)(通过在启动时向它发送消息)。 然后订阅者必须使用消息名称 + 唯一 id 来订阅消息。 消息转发服务将接收消息并通过更改消息的主题/标签将它们转发给所有注册的订阅者(唯一的 id 被添加到主题/标签中)。

此解决方法也有其局限性,消息转发服务只能有一个实例,否则您将再次遇到相同的问题。 并且消息转发服务也必须在其他订阅者之前运行,否则它不会收到注册。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM