当将 Azure ServiceBus 主题订阅与多个竞争使用者结合使用时,我只能在未设置 SubscriptionClient 的 PrefetchCount 时让使用者进行循环。
当指定任何 PrefetchCount > 1 时,在低负载下,第一个恰好接收到消息的消费者似乎被赋予了与消息的亲和性,使得所有消息仅由该消费者接收。
如果我添加负载(即在订阅中同时抛出更多消息),那么其他消费者确实会收到一些消息,但负载分布不均匀。
使用队列(和 QueueClient),消息或多或少均匀地分发到客户端 - 具有任何 PrefetchCount。
注意:
- MaxConcurrentCalls 是一个“高”值 (200)
- 我在所有情况下都使用 PeekLock 模式;
- 订阅使用 CorrelationFilter
这种主题订阅行为对我来说似乎不正确...我假设队列和订阅客户端竞争消费者机制应该是一致的。
我可能配置不正确?或者这是预期的行为?
最佳答案
队列和订阅都以相同的方式支持竞争消费者。预取是指未按您预期的方式工作。当您要求预取 N 个项目时,代理不会将这些项目平均分配给竞争的消费者。相反会尽力为每个消费者提供尽可能多的东西。因此,如果您有 10 条消息并将预取设置为 10,第一个消费者可能会获取全部消息,而第二个消费者则无需处理任何内容。
关于.net - 受 PrefetchCount 影响的 Azure Servicebus 主题订阅竞争消费者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59666477/