我正在使用代码实现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);
}
但是,这不允许两个订阅者都接收消息,而是在每个订阅者中均收到一条消息。
如何确保两个订户都收到来自总线的所有消息?
答案 0 :(得分:2)
Azure Service Bus在检索消息时是Competing Consumer pattern的代理。这是预期的行为。您这里拥有一个向外扩展的处理端点,两个端点都在尝试处理来自同一订阅的消息。消息分布在这两个竞争的使用者之间。如果需要将同一条消息分发给多个订阅者,则应该创建和收听不同的订阅实体。