我们已经在生产中使用AMQ已经有一段时间了,我们注意到我们队列中的一个奇怪的行为。
情况如下:
我们使用KahaDB以下配置:
<mKahaDB directory="${activemq.data}/mkahadb">
<filteredPersistenceAdapters>
<filteredKahaDB perDestination="true">
<persistenceAdapter>
<kahaDB checkForCorruptJournalFiles="true" journalDiskSyncStrategy="PERIODIC" journalDiskSyncInterval="5000" preallocationStrategy="zeros" concurrentStoreAndDispatchQueues="false" />
</persistenceAdapter>
</filteredKahaDB>
</filteredPersistenceAdapters>
代理处于一个相当强大的EC2实例中,但它似乎没有达到任何限制,既没有文件限制,也没有IOPS,也没有CPU限制
此目标的目标策略使用,非常类似于对JMSXGroupID使用相同分组的许多其他目标:
<policyEntry queue="suchDestination>" producerFlowControl="false" memoryLimit="256mb" maxPageSize="5000" maxBrowsePageSize="2000">
<messageGroupMapFactory>
<simpleMessageGroupMapFactory/>
</messageGroupMapFactory>
<deadLetterStrategy>
<individualDeadLetterStrategy queuePrefix="DLQ." useQueueForQueueMessages="true" />
</deadLetterStrategy>
与其他目的地相比,消费者消费消息的速度相当慢(每封邮件约50-100毫秒 其他目的地的其他消费者 - 每条消息大约10-30ms)
然而,似乎我们最终处于消费者没有按照我们期望他们的速度消费的情况,并且似乎在等待某些东西,而在消息上有大量的消息该目的地的远程经纪人。消费者似乎既不是CPU,也不是IO绑定,也不是网络流量限制。
一个症状是,如果我们将该队列拆分为两个队列,并且我们在相同数量的节点中附加相同数量的消费者来使用它,那么事情就会变得更好。此外,如果该队列存在巨大的工作负载,如果我们只是将它重命名为生产者上的suchQueue2,并在其上分配一些消费者,那么这些消费者(#一段时间)比#34; old&#上的消费者快得多# 34; suchQueue。
队列没有&#34;未分组的消息&#34;,其上的所有消息都具有JMSXGroupID属性且属于同一类型。
增加消费者数量或降低消费者数量似乎没什么影响
重新启动消费者应用程序似乎一旦队列变得“消耗慢”就会产生影响。
有没有人经历过这个:
简而言之:
经纪人正在等待相当长时间的消费者,他们似乎一直都是自由而且不忙。