ActiveMQ,经纪人网络,闲置消费者

时间:2012-12-14 01:12:10

标签: activemq

我们正在运行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"/>

3 个答案:

答案 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,它是如何从中间某处提供对象的?