【问题标题】:Load Balancing in Cluster ActiveMQ集群 ActiveMQ 中的负载均衡
【发布时间】:2021-04-16 17:50:45
【问题描述】:

假设我在一个集群中有 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 个开箱即用的策略(循环、第一元素等)。此外,我们可以通过实施ConnectionLoadBalancingPolicy 来实施我们自己的政策。假设我想实施自己的政策,根据消费者数量如何做到这一点的想法是什么?

【问题讨论】:

  • 老实说,在阅读文档后,我仍然不确定,但我假设它是客户端连接负载平衡,因为我们想要对到达的消息进行负载平衡3 个代理,根据每个代理中的消费者数量。如文档中所述,我们可以使用 5 个开箱即用的策略(Round-Robin、...、First Element)。此外,我们可以通过实现 ConnectionLoadBalancingPolicy 来实现我们自己的策略。假设我想实施自己的政策,根据消费者的数量如何做到这一点的想法是什么?

标签: activemq-artemis


【解决方案1】:

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

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

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

【讨论】:

    最近更新 更多