我们正在运行ActiveMQ 5.6.0。我们在测试环境中有3个在静态网络中运行的代理。这是当前的情况。我们有6个消费者随机连接到3个经纪人。一个经纪人有3个消费者,第二个有2个,第三个有1.当我们将消息堆到队列中时,我们看到消息在第3个经纪人上积压了1个消费者,其他两个经纪人没有得到任何消息积压和其余5个消费者闲置。
下面你会找到我们所有经纪人的配置(dev.queue01),其他两个与静态主机名的正确更改类似。
我希望消息会自动分发给其他代理以供空闲消费者使用。如果我在问题描述中遗漏了一些内容,请告诉我。提前感谢任何指导。
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd“>
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<value>file:${activemq.conf}/credentials.properties</value>
</property>
</bean>
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="prd.queue01" dataDirectory="${activemq.data}">
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry topic=">" producerFlowControl="false" memoryLimit="1mb">
<pendingSubscriberPolicy>
<vmCursor />
</pendingSubscriberPolicy>
</policyEntry>
<policyEntry queue=">" producerFlowControl="false" memoryLimit="64mb" optimizedDispatch="true" enableAudit="false" prioritizedMessages="true">
<networkBridgeFilterFactory>
<conditionalNetworkBridgeFilterFactory replayWhenNoConsumers="true" />
</networkBridgeFilterFactory>
</policyEntry>
</policyEntries>
</policyMap>
</destinationPolicy>
<managementContext>
<managementContext createConnector="true"/>
</managementContext>
<persistenceAdapter>
<amqPersistenceAdapter directory="${activemq.data}/data/amqdb"/>
</persistenceAdapter>
<systemUsage>
<systemUsage>
<memoryUsage>
<memoryUsage limit="256 mb"/>
</memoryUsage>
<storeUsage>
<storeUsage limit="750 gb"/>
</storeUsage>
<tempUsage>
<tempUsage limit="750 gb"/>
</tempUsage>
</systemUsage>
</systemUsage>
<transportConnectors>
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616" updateClusterClients="true" updateClusterClientsOnRemove="true" rebalanceClusterClients="true"/>
</transportConnectors>
<networkConnectors>
<networkConnector uri="static:(tcp://dev.queue02:61616,tcp://dev.queue03:61616)" name="queues_only" conduitSubscriptions="false" decreaseNetworkConsumerPriority="false" networkTTL="4">
<dynamicallyIncludedDestinations>
<queue physicalName=">"/>
</dynamicallyIncludedDestinations>
<excludedDestinations>
<topic physicalName=">"/>
</excludedDestinations>
</networkConnector>
</networkConnectors>
</broker>
<import resource="jetty.xml"/>
答案 0 :(得分:3)
迟到的答案,但希望它可能有助于未来的读者。
您已经描述了经纪人的网络环,其中B1,B2和B3彼此交谈,B1上有3个消费者(C1-C3),B2上有2个消费者(C4&amp; C5),和B3上的1个消费者(C6)。你没有描述你的消息产生的位置(他们首先去哪个经纪人),但是让我们说它是B3。 (B3将产生最准确匹配您的描述的最坏情况,但无论消息产生在何处,您仍然会看到不均匀的负载。)
B3有三个附属消费者:C6,B1和B2。该经纪人将在这些消费者中循环消息,因此1/3的消息将转到C6,1/3到B1,以及1/3到B2。
B1有五个附加消费者:C1,C2,C3,B2和B3。但是消息不会被传递到它们刚刚来自的同一个代理,因此有4个消费者可以计算来自B3的消息:C1,C2,C3和B2。因此,在总消息的1/3中,C1,C2和C3将分别获得1/4(总数的1/12),B2将获得相同的1/12。更多关于这一点。
B2有四个附加消费者:C4,C5,B1和B3。但是消息不会被传递给他们刚刚来自的同一个经纪人,因此有3个消费者可以计算来自B3的消息:C4,C5和B1。因此,在总消息的1/3中,C4和C5将分别获得1/3(总数的1/9),B1将获得相同的1/9。还有一点也是如此。
到目前为止,我们已经看到C6获得总消息的1/3,C1-C3获得总消息的1/12,C4-C5获得总消息的1/9,以及1/12 + 1/9 = 7/36的总消息路由到第二个代理。现在让我们回到这些消息。
在B3之后的消息中 - &gt; B1 - &gt; B2路径(总数的1/12),它们将在C4和C5上循环(因为消息不能返回到它们的原始代理B3),每个消息总数增加1/24。因此C4和C5将获得总数的1/9 + 1/24 = 11/72。
类似地,遵循B3的消息 - &gt; B2 - &gt; B1路径(总数的1/9),它们将在C1,C2和C3上循环,因此C1,C2和C3将接收总数的1/12 + 1/27 = 13/108。
在B3之后的消息中 - &gt; B1 - &gt; B2 - &gt; B3路径(总数的1/36),一半到C6(总数的1/72),一半到B1(总数的1/72)。类似地,在遵循B3的消息中 - &gt; B2 - &gt; B1 - &gt; B3路径(总数的1/36),一半到C6(总数的1/72),一半到B2(总数的1/72)。因此C6获得1/36的消息(总计13/36),B1获得总数的1/72,B2获得总数的1/72。
我们现在正在收益递减,但你现在可以看到C6获得了超过总消息的份额(36%),而连接到B1(拥有最多消费者)的消费者每个人都得到一个不足的份额(低于10%),导致C6有很多工作要做,而C1-5的工作量少得多,而且你所观察的时间空闲时间。您还可以看到某些消息如何通过网络走很长的路径导致高延迟,但这不是您的问题所在。
答案 1 :(得分:1)
远程提取,因为我不确定,但在您的配置中,您排除了所有主题
<excludedDestinations>
<topic physicalName=">"/>
</excludedDestinations>
您可以删除测试限制吗?当客户端连接到特定队列/主题时,Activemq使用咨询主题进行通信。因此,您阻止咨询主题后,您的第3个经纪人可能不了解其他客户。
答案 2 :(得分:1)
如果我理解正确,经纪人就意味着在这里排队。
我试图在Active MQ 5.5.1上做同样的事情。 我所做的只是创建了一个队列,并创建了多个消费者。 我把所有消费者都指向同一个队列。
Active-MQ自动负责分发。
我观察了以下示例:
如果我有一个队列 - 有2000条记录。 如果我同时将2个消费者指向此队列,则第一个消费者将处理从0开始的对象。第二个消费者将在随机偏移(例如700)之后开始处理对象。
一旦第一个消费者已经完成了从0到700的处理对象而第二个消费者处理了200个记录(700-900),第一个消费者可能开始从任何随机偏移(可能是1200)获取对象。
偏移的调整由ActiveMQ自动控制。
我观察过这一点。我非常确定会发生这种情况。
希望我已经回答了你的问题(或者至少正确地理解了你的问题)。
我在这里不明白的是, 如果Active-MQ创建了QUEUES,它是如何从中间某处提供对象的?