集群 ActiveMQ 中的负载均衡

Load Balancing in Cluster ActiveMQ

假设我在一个集群中有 3 个 ActiveMQ Artemis 代理:

  1. Broker_01
  2. Broker_02
  3. Broker_03

在给定的时间点,每个代理都有多个消费者:

  1. Broker_01 有 50 个消费者
  2. Broker_02 有 10 个消费者
  3. Broker_03 有 10 个消费者

我们假设在这个给定时间点有 70 条消息要发送到该集群中的队列。

我们期望集群完成负载平衡,这样 Broker_01 将收到 50 条消息,Broker_02 10 条消息,Broker_03 也收到 10 条消息,但目前我们正在经历这 70 条消息通过所有 3 个代理随机分发。

是否可以进行任何配置以根据每个代理中的消费者数量分发消息?

我刚刚阅读 the documentation。因此,据我了解,如果我们配置集群连接,ActiveMQ 会基于循环法进行负载平衡。我们的 broker.xml 看起来像这样:

        <cluster-connections>
            <cluster-connection name="my-cluster">
                <connector-ref>amq-v01_connector</connector-ref>
                <min-large-message-size>524288</min-large-message-size>
                <call-timeout>120000</call-timeout>
                <retry-interval>500</retry-interval>
                <retry-interval-multiplier>1.5</retry-interval-multiplier>
                <max-retry-interval>2000</max-retry-interval>
                <use-duplicate-detection>true</use-duplicate-detection>
                <message-load-balancing>ON_DEMAND</message-load-balancing>
                <max-hops>1</max-hops>
                <notification-interval>800</notification-interval>
                <notification-attempts>2</notification-attempts>
                <static-connectors>
                    <connector-ref>amq-v02_connector</connector-ref>
                </static-connectors>
            </cluster-connection>
        </cluster-connections>

此外,队列的地址设置如下所示:

            <address-setting match="MyQueue">
                <address-full-policy>BLOCK</address-full-policy>
                <max-size-bytes>50Mb</max-size-bytes>
            </address-setting>

我是不是遗漏了什么,所以负载平衡会完成?

下一点将如文档中所述,负载平衡始终基于循环进行,无法配置基于每个节点中消费者数量的负载平衡。

我假设我需要客户端连接负载平衡,因为我们希望根据每个代理中的消费者数量对到达 3 个代理的消息进行负载平衡。如文档中所述,我们可以使用 5 种开箱即用的策略(Round-Robin、First Element 等)。此外,我们可以通过实施 ConnectionLoadBalancingPolicy 来实施我们自己的政策。假设我想实施自己的政策,如何根据消费者的数量来实施?

生产者没有开箱即用的方法来了解每个代理上有多少消费者,然后相应地向这些代理发送消息。

您可以实现自己的 ConnectionLoadBalancingPolicy。但是,为了确定队列负载平衡策略实现中存在多少消费者,需要知道集群中所有代理的 URL 以及您要向其发送消息的队列的名称,并且无法提供该信息。 ConnectionLoadBalancingPolicy 界面非常 简单。

如果每个节点上的消息太少,我鼓励您首先重新审视您对 3 节点集群的需求。在某些用例中,单个代理可以处理数百万条消息的吞吐量。如果每个节点处理的消​​息少于 50 条,那么您可能根本不需要集群。