ActiveMQ中消息的消息消耗的大量延迟

问题描述

我们有一个代理网络,该网络由位于不同服务器上的三个代理组成。 网络连接器的配置如下:

    <networkConnectors>
      <networkConnector uri="static:(ssl://broker2:61616,ssl://broker3:61616)" networkTTL="5"/>
    </networkConnectors>

整体设置如下图所示。

enter image description here

在实践中,有时我们会看到特定客户端的消息使用延迟很大。在这种情况下,在最终使用消息之前,会将消息多次转发给其他代理。到目前为止,我们一直无法找出造成这种情况的原因。

消费者不是很忙。它们是使用Spring JMS库实现的。每个经纪人的最小消费者数量为3,但这可以根据需要自动扩展。

我们怀疑仅特定客户端受到影响的原因可能与我们使用JMSGroupId来获取有关消息处理方式的一些顺序有关。但是,我们不确定这一点。而且它仍然无法解释为什么它会发生。

我们还考虑向网络连接器添加以下参数,因为我们认为这可能会改善行为:

dynamicOnly="true"
decreaseNetworkConsumerPriority="true"
suppressDuplicateQueueSubscriptions="true"

但是,做起来也很恐怖,因为我们认为我们还不完全了解当前正在发生的事情,因此无法真正确定这些设置对行为的影响。

解决方法

我们怀疑只有特定客户受到影响的原因, 可能与我们使用JMSGroupId来 对消息的处理方式进行排序。

宾果

如果您确保串行消息处理,则扩展使用者是没有用的。消除此行为的最佳方法是建立一个专用的JMS队列,每个组一个消费者。否则,当队列中的多个后续消息属于同一组时,您将尝试消费者争用。

请参见JMS topology (Queue with multiple consumers) and message groups