【问题标题】:Azure Servicebus Topic Subscription competing consumers affected by PrefetchCount受 PrefetchCount 影响的 Azure Servicebus 主题订阅竞争消费者
【发布时间】:2020-01-09 14:47:12
【问题描述】:

当使用具有多个竞争消费者的 Azure ServiceBus 主题订阅时,我只能在 SubscriptionClient 的 PrefetchCount 未设置时让消费者循环。

当指定任何 PrefetchCount > 1 时,在低负载下,第一个碰巧收到消息的消费者似乎被赋予了与消息的关联性,这样所有消息都只能由该消费者接收。

如果我添加负载(即在订阅中同时抛出更多消息),那么其他消费者确实会收到 一些 消息,但负载分布不均。

使用 Queue(和 QueueClient),消息或多或少均匀地分配给客户端 - 使用任何 PrefetchCount。

注意:

  • MaxConcurrentCalls 是一个“高”值 (200)
  • 我在所有情况下都使用 PeekLock 模式;
  • 订阅使用 CorrelationFilter

这种主题订阅行为对我来说似乎不正确......我假设队列和订阅客户端竞争消费者机制应该是一致的。

我可能没有正确配置什么?还是这是预期的行为?

【问题讨论】:

    标签: .net azure servicebus azure-servicebus-topics


    【解决方案1】:

    队列和订阅都以相同的方式支持竞争消费者。预取是不按您预期的方式工作的。当您要求预取 N 个项目时,代理不会将这些项目平均分配给竞争的消费者。宁愿尽可能多地给每个消费者。因此,如果您有 10 条消息并将预取设置为 10,则第一个使用者可能会得到所有信息,而第二个使用者则无事可做。

    【讨论】:

    • 我希望你能发表评论,@Sean - 谢谢。如果有这 N 个项目同时可用,我会同意你的看法。然后,一个消费者的预取计数(>N)将导致该消费者接收到所有消息。但是在低负载的情况下——一次只接收一条消息——为什么第一个消费者总是优先?
    • 代理无法保证所有可用的消息都发送给第一个消费者,即使在代理上发现的预取数为 N 且少于 N 条消息也是如此。在那一刻,它可以提供尽可能多的东西。可能是一、二或 N。与 RabbitMQ 不同,服务总线不会尝试在竞争消费者 AFAIK 之间平均分配预取消息。因此这种“随机”分布。
    • 另一个建议是向经纪人团队提出问题,要求记录该行为。问题跟踪器:github.com/Azure/azure-service-bus/issues
    猜你喜欢
    • 1970-01-01
    • 2017-01-24
    • 2017-07-08
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    • 2019-06-02
    • 2017-07-31
    • 1970-01-01
    相关资源
    最近更新 更多