[英]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.