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

时间:2014-08-18 17:49:59

标签: java queue activemq dispatch

我正在使用ActiveMQ 5.8和在camel路由中配置的通配符使用者。

我正在使用默认的ActiveMQ配置,因此我的默认设置如下

prefetch = 1
dispatch policy= Round Robin

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

消费者除了打印消息外没有做任何事情(因此没有数据库阻塞或消费者问题缓慢)

修改 我为每个队列

设置了preFetch为1

我观察到的其中一个排队比其他排队更快。

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

一个令人惊讶的观察结果是 虽然activemq webconsole为每个队列显示5个消费者

enter image description here

当我调试我的消费者时,我看到来自camel流的5个线程/消费者只有一个通配符队列* .processQueue enter image description here

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

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

2 个答案:

答案 0 :(得分:2)

我能够找到对此行为的引用

通配符队列使用者的消息分发是随机的。

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

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

试用后&错误,我得出了以下公式,以便在消费者中公平分配,并且所有队列都以几乎相同的速度排队。

prefetch = number of wildcard consumers

答案 1 :(得分:0)

比较队列消耗的速度可能是错误的。负载平衡通常发生在消费者之间。因此,我们的想法是,第一个队列中的五个消费者中的每个消费者都会得到相当均匀的负载(假设他们连接到同一个经纪人)。

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