【问题标题】:How activemq wildcard consumers work?activemq 通配符消费者如何工作?
【发布时间】:2014-10-11 17:07:36
【问题描述】:

我正在使用 ActiveMQ 5.8,并在骆驼路线中配置通配符消费者。

我使用的是默认的 ActiveMQ 配置,所以我的默认配置如下

prefetch = 1
dispatch policy= Round Robin

现在我启动一个消费者 jvm,每个消费者有 5 个消费者,用于 2 个队列。两个队列都有相同类型的消息和相同数量的消息。

消费者除了打印消息什么都不做(所以没有数据库阻塞或消费者缓慢的问题)

编辑 我已将每个队列的 preFetch 设置为 1

我观察到其中一个队列比其他队列更快耗尽。

我期望的是队列以相同的速度耗尽,一种负载平衡。

一个令人惊讶的观察结果是 尽管 activemq webconsole 显示每个队列有 5 个消费者

当我调试我的消费者时,我只看到来自骆驼流的 5 个线程/消费者用于通配符队列 *.processQueue

上述行为的原因是什么? 如何确保所有队列以相同的速度耗尽?

有没有人分享编写自定义调度策略或覆盖 activemq 的默认值的经验?

【问题讨论】:

    标签: java queue activemq dispatch


    【解决方案1】:

    我能够找到此行为的参考

    通配符队列消费者的消息分布是随机的。

    http://activemq.2283324.n4.nabble.com/Wildcard-and-message-distribution-td2346132.html#a2346133

    虽然这可以通过设置适当的预取大小来调整。

    经过反复试验,我得出了以下公式,以便在消费者之间公平分配,并且所有队列以几乎相同的速度出队。

    prefetch = number of wildcard consumers
    

    【讨论】:

      【解决方案2】:

      比较队列的消耗率可能是错误的。负载平衡通常发生在消费者之间。因此,这个想法是,第一个队列上的五个消费者中的每一个都将获得相当均匀的负载(假设他们连接到同一个代理)。

      但是,我认为您可能需要仔细检查负载测试设置。例如,在同一台机器上运行代理和消费者时,它很少给出可预测的结果。

      【讨论】:

      • 我在其他机器上运行 activemq 服务器和消费者进行了测试,但我仍然看到相同的行为。两个队列消费者都在一台机器上,这有什么不同吗?
      • 我不知道 ActiveMQ 如何在幕后分派给消费者,但我有一个案例,我有数百个队列可以使用“>”通过单个路由排空。我的观察和你看到的一样。我这样做的原因不是为了效率。您试图解决仅使用单个队列无法解决的问题?
      猜你喜欢
      • 2014-10-09
      • 2014-08-06
      • 1970-01-01
      • 2018-10-27
      • 2012-04-18
      • 2021-12-02
      • 2012-12-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多