2012-12-14 75 views
3

我们正在运行ActiveMQ 5.6.0。在我们的测试环境中,我们有3个经纪人在静态网络中运作。这是当前的情况。我们有6个消费者随机连接到3个经纪人。一个经纪人有3个消费者,第二个有2个,第三个有1个。当我们把消息堆积到队列中时,我们看到消息在第三个消费者上被消费者记录下来,另外两个消费者没有给出的积压和其余5名消费者闲置。ActiveMQ,经纪人网络,闲置消费者

下面您可以找到我们的所有经纪商(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"/> 

回答

3

最后答案,但希望它可以帮助未来的读者。

您已经描述了经纪人的网络环,其中B1,B2和B3全都相互交谈,B1上有3位消费者(C1-C3),B2上有2位消费者(C4 & C5),1位消费者(C6)在B3上。你没有描述你的信息在哪里制作(他们首先选择哪个经纪商),但我们假设它是B3。 (B3会产生最准确匹配您的描述的最坏情况,但无论邮件产生在何处,您仍然会看到不均衡的负载。)012有三个连接的消费者: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-> B1-> B2路径(总数的1/12)的消息中,它们将在C4和C5之间获得轮回机会(因为消息不能返回到它们的原始代理B3),每个消息的额外1/24。因此C4和C5将获得总数的1/9 + 1/24 = 11/72。类似地,在B3→B2→B1路径(总数的1/9)之后的消息中,它们将在C1,C2和C3上得到循环移动,所以C1,C2和C3将获得总数的1/12 + 1/27 = 13/108。

在B3 - > B1 - > B2 - > B3路径(总数的1/36)之后的消息中,一半去C6(总数的1/72),一半去B1总数的1/72)。类似地,在B3→B2→B1→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

一种远取,因为我真的不知道,但在你的配置,你拥有所有的话题排除

<excludedDestinations> 
    <topic physicalName=">"/> 
</excludedDestinations> 

您可以删除限制进行测试。当客户端连接到特定的队列/主题时,Activemq使用咨询主题进行通信。因此,由于您阻止了咨询主题,因此您的第3个经纪人可能不知道其他客户。

+0

谢谢,请试试看! –

+0

建议消息正常工作,所以这不是很不幸。我在这里遇到了这个参数“sendAdvisoryIfNoConsumers”:http://activemq.apache.org/advisory-message.html 接下来我们会试试这个。 –

1

如果我正确地理解了你,经纪人意味着在这里排队。

  • 所有的经纪人都有相同类型的对象。
  • 所有你的消费者都做同样的过程。
  • 而且您希望平均分担您的消费者之间的工作量。
  • 操作顺序并不重要。

我试图在Active MQ 5.5.1上做同样的事情。 我所做的只是创建了一个Queue,并创建了多个消费者。 我将所有消费者都指向同一队列。

Active-MQ自动处理分配。

我观察到以下实施例:

如果我有一个队列 - 具有2000次的记录。 如果我将2个消费者同时指向该队列,则第一个消费者将处理从0开始的对象。第二个消费者将在随机偏移(例如从700开始)之后开始处理对象。

一旦第一个消费者完成处理对象从0 - 700和第二个消费者已经处理了200条记录(700 - 900),第一个消费者可能会从任意随机偏移量(可能是1200)开始获取对象。

偏移的调整由ActiveMQ自动控制。

我已经观察到了这一点。我非常肯定会发生这种情况。

希望我已经回答了您的问题(或至少正确理解您的问题。)。

我在这里不理解的是, 如果Active-MQ创建QUEUES,它是如何为其间的某个对象提供服务的?

+0

嗨,这并不完全。为了冗余目的,我们操作三台配置为“经纪人网络”的独立主机。有关信息,请参见此页面:http://activemq.apache.org/networks-of-brokers.html –