activemq 通配符消费者如何工作?

Posted

技术标签:

【中文标题】activemq 通配符消费者如何工作?【英文标题】:How activemq wildcard consumers work? 【发布时间】: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 的默认值的经验?

【问题讨论】:

【参考方案1】:

我能够找到此行为的参考

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

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

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

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

prefetch = number of wildcard consumers

【讨论】:

【参考方案2】:

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

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

【讨论】:

我在其他机器上运行 activemq 服务器和消费者进行了测试,但我仍然看到相同的行为。两个队列消费者都在一台机器上,这有什么不同吗? 我不知道 ActiveMQ 如何在幕后分派给消费者,但我有一个案例,我有数百个队列可以使用“>”通过单个路由排空。我的观察和你看到的一样。我这样做的原因不是为了效率。您试图解决仅使用单个队列无法解决的问题?

以上是关于activemq 通配符消费者如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

ActiveMQ学习第六篇:Destination的特性

centos 安装activeMq

RabbitMQ工作模式

ActiveMQ——Destination高级特性

rabbitMQ工作模式

ActiveMQ之Destination