问题描述
我们有一个代理网络,该网络由位于不同服务器上的三个代理组成。 网络连接器的配置如下:
<networkConnectors>
<networkConnector uri="static:(ssl://broker2:61616,ssl://broker3:61616)" networkTTL="5"/>
</networkConnectors>
整体设置如下图所示。
在实践中,有时我们会看到特定客户端的消息使用延迟很大。在这种情况下,在最终使用消息之前,会将消息多次转发给其他代理。到目前为止,我们一直无法找出造成这种情况的原因。
消费者不是很忙。它们是使用Spring JMS库实现的。每个经纪人的最小消费者数量为3,但这可以根据需要自动扩展。
我们怀疑仅特定客户端受到影响的原因可能与我们使用JMSGroupId来获取有关消息处理方式的一些顺序有关。但是,我们不确定这一点。而且它仍然无法解释为什么它会发生。
我们还考虑向网络连接器添加以下参数,因为我们认为这可能会改善行为:
dynamicOnly="true"
decreaseNetworkConsumerPriority="true"
suppressDuplicateQueueSubscriptions="true"
但是,做起来也很恐怖,因为我们认为我们还不完全了解当前正在发生的事情,因此无法真正确定这些设置对行为的影响。
解决方法
我们怀疑只有特定客户受到影响的原因, 可能与我们使用JMSGroupId来 对消息的处理方式进行排序。
宾果
如果您确保串行消息处理,则扩展使用者是没有用的。消除此行为的最佳方法是建立一个专用的JMS队列,每个组一个消费者。否则,当队列中的多个后续消息属于同一组时,您将尝试消费者争用。
请参见JMS topology (Queue with multiple consumers) and message groups